繁体   English   中英

Django CreateView 不保存对象

[英]Django CreateView is not saving object

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

模型.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 创建的帖子没有保存在数据库中.. 任何想法..??

谢谢

一个提示:在定义表单时不要使用exclude ,使用fields更安全,也是推荐的方法。

重定向由get_success_url方法定义。 如果您的模型中有get_absolute_url CreateView方法将重定向到该 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/

问题是您排除了必填字段,因此它不会通过您的表单验证。

您应该使用一些默认值隐藏这些字段,让使用填充它们,将它们设置为 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)

多年后我今天遇到了这个问题,但这些答案似乎不正确。

这里的主要问题是 CreateView 的 form.instance 是 None 。 所以我的方法如下作为 django 文档的建议表:

def form_valid(self, form):
    instance = form.save(commit=False)
    instance.user = self.request.user
    instance.post_date = datetime.now()
    instance.save()
    return redirect(self.get_success_url())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM