2013-07-24 111 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

相关问题