Django CreateView没有保存obj

2024-03-28 19:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个基本的blog应用程序练习基于django类的视图。 但是,出于某种原因,我的Post模型的CreateView没有将Post保存在数据库中。

型号.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')

表单.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        exclude = ('user', 'post_date')

视图.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创建的post未保存在数据库中。。 你知道吗。。??

谢谢


Tags: pyselfform视图数据库datemodelsblog
3条回答

一个提示:在定义表单时不要使用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,))

我认为在使用CBV时,您会发现此页非常有用: http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/

问题是,您正在排除强制字段,因此它不会通过表单验证。

您应该传递这个用一些默认值隐藏的字段,让use填充它们,将它们设置为null=True,或者在访问form_valid之前填充它们

我认为这是一个不调用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)

相关问题 更多 >