在Django中执行以下代码的位置?

时间:2014-02-22 14:35:33

标签: python django django-forms django-views django-generic-views

尝试学习Django,也许我的主要概念是错误的。

创建表单:

class PostForm(ModelForm):
class Meta:
    model = Post
    exclude = ('pub_date', )
    labels = {
        'body_text': _('Post'),
}

使用以下格式调用视图:

class PostCreate(generic.CreateView):
    template_name = 'post/post_form.html'
    form_class = PostForm

问题是我需要手动输入EXCLUDED值。 Python docs say to do something like this:

form = PartialAuthorForm(request.POST)
author = form.save(commit=False)
author.title = 'Mr'
author.save()

我不知道在哪里输入此代码。我对View函数的理解是它们包含了制作页面的代码,因此不再被调用,但我可能错了。或者也许我不能在这种情况下使用通用视图?

解决这个问题就足够了,但对观点的概念性解释会更好。

3 个答案:

答案 0 :(得分:2)

什么是POSTView?这是你创造的东西,还是django中的新东西?

完成您要做的事情的一种方法是使用django FormView(或CreateView)并覆盖form_valid方法。

class PostCreate(CreateView):
    template_name = 'post/post_form.html'
    form_class = PostForm

    def form_valid(self, form):        
        author = form.save(commit=False)
        author.title = 'Mr'
        author.save()
        # return HttpResponse

答案 1 :(得分:1)

如果您正在使用通用视图,则应查看https://docs.djangoproject.com/en/1.6/ref/class-based-views/generic-editing/#createview并查找从祖先(MRO)继承的方法。

在这里,您可以覆盖post方法,以便在保存模型实例之前为pub_date字段指定值。类似的东西:

class PostCreate(generic.CreateView):
    template_name = 'post/post_form.html'
    form_class = PostForm

    def post(self, request, *args, **kwargs):

         form = PostForm(request.POST)

         if form.is_valid():
             post = form.save(commit=False)
             post.pub_date = datetime.now()
             post.save()

             return self.form_valid(form)

         return self.form_invalid(form)

您甚至可以直接使用form_valid方法覆盖。 无论哪种方式,提醒可以使用GET请求(涉及表单的表示,通常为创建视图为空)和POST(表单提交)来调用视图。

查看ModelForm的Django文档,以更好地理解绑定和未绑定的表单行为。

希望这有帮助!

答案 2 :(得分:0)

此示例使用的是函数视图,而不是基于类的函数视图。您可以在form_valid方法的类视图中执行此操作,但是您需要删除第一行,因为表单已经传递给该方法。