【问题标题】:How to implement a Django class-based view that is both TemplateView and FormView?如何实现一个既是 TemplateView 又是 FormView 的基于 Django 类的视图?
【发布时间】:2014-10-03 15:31:20
【问题描述】:

我正在尝试创建一个使用基于类的视图的 django 网页。该网页需具备以下功能:

  1. 网页必须通过 HTTP GET 从 URL 获取参数,并使用这些参数向用户显示一些信息
  2. 网页必须基于表单从用户那里收集一些信息
  3. 网页必须验证用户提交给表单的信息。如果任何表单数据无效,则必须在表单上向用户显示错误,以便她更正并重新提交。

我知道如何通过创建一个继承自 django.views.generic.TemplateView 的类来创建一个编号为 1 的网页。我知道如何通过创建一个继承自 django.views.generic.editFormView 的类来创建一个执行编号 23 的网页。但我不知道如何制作一个同时完成这三个方面的网页。我尝试创建一个继承自 TemplateViewFormView 的类,但发现我仍然无法获取 HTTP GET 数据。请告知我如何才能完成这项工作。

这是我的相关@​​987654325@ 条目:

url(
    r'^myPage/(?P<myArg1>\d+)-(?P<myArg2>\d+)/?$',
    myView.as_view(), 
    name='myName'
),

这是我的视图类:

class myView(FormView, TemplateView):
    template_name = 'myApp/myTemplate.html'
    form_class = myForm
    success_url = reverse_lazy("successPage")


    def get_context_data(self, **kwargs):
        context = super(myView, self).get_context_data(**kwargs)

        myArg1 = int(kwargs["myArg1"])
        myArg2 = int(kwargs["myArg2"])

        # Do some validation and some other interesting stuff here based on
        # the values of myArg1 and myArg2 and put the result into self.newArg
        self.newArg = myDummyFunction(myArg1, myArg2)

        context["form"] = self.form_class


        return context


    def form_valid(self, form):

        formField1 = form.cleaned_data.get('field1')
        logger.debug("self.newArg = %s" % self.newArg) # <--- This Fails! self.newArg doesn't exist!
        return super(myView, self).form_valid(form)

【问题讨论】:

    标签: python django django-forms django-class-based-views


    【解决方案1】:

    你把这件事弄得太复杂了。 FormView - 与几乎所有通用视图一样 - 已经继承自 TemplateView(或者更确切地说,继承自 ContextMixin,它包含您所追求的所有功能),因此无需在声明中添加第二个类。

    您的代码不起作用的唯一原因是当表单有效时不会调用 get_context_data - 因为有效表单总是重定向到另一个视图,因此没有理由获取当前视图的任何上下文数据。但是您根本不需要访问 form_valid 中的那个参数:您应该将它添加到 get_context_data 中的上下文字典中,然后您可以像访问任何其他上下文变量一样在模板中访问它。

    【讨论】:

    • 通常你不需要上下文来渲染模板,所以默认的ProcessFormView类是FormView继承自的几个类之一在验证之前不会调用get_context_data ,或在成功重定向之前。如果您需要来自 URL 的参数来验证表单,这些参数在 self.kwargs 中可用 - 它们由基础 View 类捕获。 get_context_data 旨在准备模板将使用的对象,而不是收集有关请求等信息以用于视图其他部分的唯一方法。
    • 一点进一步的建议 - 我发现通过阅读源代码比阅读文档更容易理解基于类的通用视图的作用。来源并不晦涩,只是分散在多个类中。对于这个问题,github.com/django/django/blob/master/django/views/generic/…github.com/django/django/blob/master/django/views/generic/… 包含必要的类。
    • 另外:ccbv.co.uk 有助于理解 CBV、方法和属性。
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多