【问题标题】:Where to execute the following code in Django?在 Django 中在哪里执行以下代码?
【发布时间】:2014-03-24 05:22:50
【问题描述】:

尝试学习 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 值。 蟒蛇docs say to do something like this:

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

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

解决这个问题就足够了,但对视图进行概念性解释会更好。

【问题讨论】:

  • 它应该是 generic.CreateView。我修好了它。对此感到抱歉。

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


【解决方案1】:

什么是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

【讨论】:

  • 它的 generic.CreateView,很抱歉。我编辑了它。
【解决方案2】:

如果您使用的是通用视图,您应该查看 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 文档以更好地了解绑定和未绑定的表单行为。

希望这会有所帮助!

【讨论】:

  • 感谢您提醒我重写继承的函数。 +1
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多