2013-07-24 82 views
5

我正在練習django基於類的視圖與一個基本的博客應用程序。 但是,由於某些原因,我的博文模型的CreateView不會將該博文保存在數據庫中。Django 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') 

forms.py

class PostForm(forms.ModelForm): 
    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): 
     form.instance.user = self.request.user 
     form.instance.post_date = datetime.now() 
     return super(PostCreate, self).form_valid(form) 

它顯示內容的無線沒有產生任何錯誤,但是當我檢查管理頁面, CreateView創建的帖子沒有保存在數據庫中.. 任何想法.. ??

感謝

+0

嘗試做'form.save()'先然後調用之前超!如果這有幫助 –

+0

我試過你的代碼,它適用於我。還有別的東西。保存後將其重定向到帖子列表或發佈表單嗎? – sneawo

+0

'form.save()'應該由'super'調用,因爲他使用的是ModelForm –

回答

6

一個建議:定義表單時不使用exclude,使用fields,更安全,推薦的方式做到這一點。

重定向由get_success_url方法定義。如果您的模型中有方法get_absolute_urlCreateView將重定向到該URL,否則您總是可以在視圖中覆蓋get_success_url

使用get_absolute_url

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') 

    @permalink 
    def get_absolute_url(self): 
     return ('myurlname',(), {'myparam': something_useful}) 

使用get_success_url

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

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

    def get_success_url(self): 
     return reverse('myurlname', args=(somethinguseful,)) 

我想你會發現這個頁面非常有用與CBVS工作時: http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/

0

餘噸這是一個簡單的例子,不要撥打form.save()。當表單被驗證時,所有的檢查都完成了,但它實際上並沒有將對象保存在數據庫中。要做到這一點,你需要明確告訴它,通過save()方法。

所以,你想:

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

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

的問題是,你是排除均爲必填字段,所以它不會通過您的表單驗證。

你應該通過這個領域蘊藏着一些默認值,讓使用填充它們,將它們設置爲null = True或填充它們訪問form_valid

相關問題