如何实现一个基于Django类的视图,它是TemplateView和FormView?

时间:2014-08-10 20:04:22

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

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

  1. 网页必须通过HTTP GET从URL获取参数并使用这些参数向用户显示一些信息
  2. 网页必须根据表单
  3. 收集用户的一些信息
  4. 网页必须验证用户提交给表单的信息。如果任何表单数据无效,则必须在表单上向用户显示错误,以便她可以更正并重新提交。
  5. 我知道如何通过创建一个继承自django.views.generic.TemplateView的类来创建编号为 1 的网页。我知道如何通过创建一个继承自django.views.generic.editFormView的类来创建编号 2 3 的网页。但是我无法弄清楚如何制作一个能完成这三项工作的网页。我尝试创建一个继承自TemplateViewFormView的类,但发现我仍然无法获取HTTP GET数据。请告诉我如何才能完成这项工作。

    以下是我的相关urls.py条目:

    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)
    

1 个答案:

答案 0 :(得分:3)

你过度复杂了。 FormView - 就像几乎所有通用视图一样 - 已经从TemplateView继承(或者更确切地说,来自ContextMixin,它包含了你以后的所有功能),因此不需要在声明中添加第二个类。

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