2013-07-26 21 views
7

Django'nun FormView'leri ile çalışıyorum.Django CreateView, "çoktan çoğa" ilişkisinden önce "alan için bir değere sahip olması gereken" ... "hata verir."

Bu uygulamada, bir blog yayını oluşturan bir PostCreate görünümü oluşturuyorum. İşte

benim kodlardır:

models.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    posts = models.ManyToManyField(Post) 

forms.py

class PostForm(forms.ModelForm): 
    post_title = forms.CharField(
     label=u'Title', 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    post_content = forms.CharField(
     label=u'Content', 
     widget=forms.TextInput(attrs={'size':128}) 
    ) 
    tags = forms.CharField(
     label=u'Tags', 
     required=True, 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    class Meta: 
     model = Post 
     exclude = ('user', 'post_date') 

views.py

01 Bu çok-çok ilişkisi olmadan önce alan "post" için bir değer olması

ihtiyaçlar:

Bir veritabanına bir yazı (Test Mesaj 1) kaydetmeyi deneyin, bana bir hata veriyor Kullanılmış.

Soruna, "etiket" alanını böldüğüm ve etiketleri post nesnesinin tag_set alanına eklediğim. Bu mantık form_valid yöntemde dahil edilmemelidir herhalde ... ama bu uygulanmalıdır başka nerede bilmiyorum ..

Herhangi bir yardım büyük takdir :) Teşekkürler

cevap

9

Hayır, o değil sorun nedir. Sorun şu ki, Post nesnesini henüz kaydetmediniz, bu yüzden onunla çoktan çoğa bir ilişki oluşturamazsınız (çünkü başlık altında, m2m her iki tarafa da yabancı anahtarlı bir bağlantı tablosu). Çözüm önce self.object'u kaydetmektir.

+0

Öneriniz hatası çözüldü !! Ancak, bunu yaptıktan sonra, HERHANGİ BİR gönderiye herhangi bir nedenle Tag nesnesine eklenir .... Örneğin, Tag1'i Post # 4'e eklersek, Tag1, Post # 1, Post # 2, Post # 3 ve Post'a eklenir. # 4 .. Bu neden oluyor idk yapın ... :( – user2492270

+0

Evet, ipucu gerçekten yardımcı olur. Bu arada, bazen iyi hata mesajları yeşil olduğunu düşünüyorum. Kötü (kafa karıştırıcı) hata iletileri (bu gibi) düşünmek için sormak için google (ve ayrıca cevaplanması gerekir.) Belki daha da kötüsü, eğer soru soran kişi doğru cevabı kabul etmiyorsa ;-) – stanleyxu2005

+0

Saatlerimi kurtardığın için teşekkür ederim. .... –

7

Bu üyeyi atama sonra nesneyi kaydetmek ve daha sonra m2m ilişkilerle yerine getirmelidir:

self.object = form.save(commit=False) # Not saved to database. 
self.object.user = self.request.user 
self.object.save() # Saved. 

tag_names = form.cleaned_data['tags'].split() 
for tag_name in tag_names: 
    tag, dummy = Tag.objects.get_or_create(name=tag_name) 
    self.object.tag_set.add(tag)