2013-07-26 26 views
7

我正在練習Django的FormViews。Django CreateView在使用多對多關係之前給出了一個錯誤「需要爲字段賦值......」。「

在這個應用程序中,我創建了一個創建博客文章的PostCreate視圖。

這裏是我的代碼:

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

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.user = self.request.user 

     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) 

     return super(PostCreate, self).form_valid(form) 

當我嘗試保存後(後測1)到數據庫中,它給了我一個錯誤:

需要這麼多的一對多關係可以是之前有場「後」的值用過的。

看起來問題是由views.py中的行引起的,其中我將「標記」字段分開並將標記添加到帖子對象的tag_set字段。我想這樣的邏輯不應包括在form_valid方法...但我不知道還有什麼地方本應實施..

任何幫助將不勝感激:)謝謝

回答

9

不,這不是問題是什麼。問題是你還沒有保存Post對象,所以你不能創建一個多對多的關係(因爲在這個背後,m2m只是一個連接兩個實體的外鍵的表)。解決方法是首先保存self.object

+0

你的建議解決的錯誤!但是,做完這些之後,由於某種原因,爲每個帖子添加了Tag對象....例如,如果我將Tag1添加到Post#4,Tag1會添加到Post#1,Post#2,Post#3和Post #4 .. Idk爲什麼會發生這樣的事情...... :( – user2492270

+0

是的。提示真的有幫助。順便說一句,有時我認爲好的錯誤信息是綠色的。錯誤信息(像這樣)需要考慮谷歌要求(也要回答)。也許更糟的是,如果提問者不知道接受正確的答案;-) – stanleyxu2005

+0

謝謝你節省我的時間。 .... –

7

你應該分配用戶後保存對象,然後做的事情與M2M關係:

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) 
相關問題