2013-07-24 46 views
0

我練Django的通用視圖,特別ModelFormsDjango的CreateView的是不節能的對象

這是我的觀點和模型

models.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 
    post_date = models.DateTimeField('date posted') 

    def get_absolute_url(self): 
     return reverse('user-detail', kwargs={'pk': self.pk}) 

    def __unicode__(self): 
     return self.post_title 

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}) 
    ) 
    class Meta: 
     model = Post 

views.py

class PostCreate(CreateView): 
    fields = ['post_title', 'post_content'] 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PostCreate, self).dispatch(*args, **kwargs) 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.user = self.request.user 
     self.object.post_date = datetime.now() 
     return super(PostCreate, self).form_valid(form) 

的觀點似乎做工精細,不顯示任何錯誤。但是,當我在提交表單並保存文章後檢查Django管理頁面時,由於某種原因,文章未保存到數據庫中。

任何想法爲什麼會發生這種情況?

+0

你有任何形式的錯誤? – lalo

回答

1

試試這個。

def form_valid(self, form): 
    form.instance.user = self.request.user 
    form.instance.post_date = datetime.now() 
    return super(PostCreate, self).form_valid(form) 
4

正如我可以從你的代碼,看你用

self.object = form.save(commit=False) 

這意味着對象將不會被保存到數據庫中,但你可以用它獲得進一步的處理。所以你應該使用這樣的東西:

self.object = form.save(commit=False) # Not hit database 
self.object.user = self.request.user # Update user 
self.object.post_date = datetime.now() # Update post_date 
self.object.save() # And finally save your object to database. 
+0

small fix- self.object.save(),not self.obejct.save()。但你的回答是對的。 – nnmware

+0

@nnmware可以使用[編輯](http://stackoverflow.com/posts/17835949/edit)功能應用小修補程序。鼓勵編輯其他人的答案。您獲得建議有價值編輯的聲望點。 –