7

我正在用一个基本的博客应用程序练习 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 创建的帖子没有保存在数据库中.. 有什么想法..??

谢谢

4

4 回答 4

8

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/

于 2013-07-24T08:02:50.790 回答
3

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

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

于 2013-09-21T00:01:35.310 回答
0

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

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

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())
于 2020-05-24T04:22:01.327 回答
-1

我认为这是一个简单的不调用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)
于 2013-07-24T15:25:40.460 回答