Django CreateView不保存对象

时间:2013-07-24 06:32:22

标签: 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')

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

由于

4 个答案:

答案 0 :(得分:6)

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

重定向由get_success_url方法定义。如果您的模型中有方法get_absolute_url CreateView 将重定向到该网址,否则您始终可以在视图中覆盖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/

答案 1 :(得分:1)

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

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

答案 2 :(得分: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)

答案 3 :(得分:0)

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

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

button = browser.find_elements_by_xpath('//h4[@class="start"]')[1].click()