Django CreateView不保存对象

use*_*270 6 python django django-class-based-views

我正在使用基本的博客应用程序练习django Class-Based-View.但是,出于某种原因,我的Post模型的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')
Run Code Online (Sandbox Code Playgroud)

forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        exclude = ('user', 'post_date')
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

它显示内容而不会产生任何错误,但是当我检查管理页面时,CreateView创建的帖子没有保存在数据库中..任何想法.. ??

谢谢

Die*_*rro 6

一个提示: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})
Run Code Online (Sandbox Code Playgroud)

使用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,))
Run Code Online (Sandbox Code Playgroud)

我想你会发现这个页面在使用CBV时非常有用:http: //ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/


小智 5

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

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