我试图创建一个使用基于类的视图的django网页。该网页需要具备以下功能:
我知道如何通过创建一个继承自django.views.generic.TemplateView
的类来创建编号为 1 的网页。我知道如何通过创建一个继承自django.views.generic.editFormView
的类来创建编号 2 和 3 的网页。但是我无法弄清楚如何制作一个能完成这三项工作的网页。我尝试创建一个继承自TemplateView
和FormView
的类,但发现我仍然无法获取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)
答案 0 :(得分:3)
你过度复杂了。 FormView - 就像几乎所有通用视图一样 - 已经从TemplateView继承(或者更确切地说,来自ContextMixin,它包含了你以后的所有功能),因此不需要在声明中添加第二个类。
您的代码尚未运行的唯一原因是当表单有效时不会调用get_context_data - 因为有效表单总是重定向到另一个视图,因此没有理由获取当前表单的任何上下文数据。但是你根本不需要访问form_valid中的那个参数:你应该把它添加到get_context_data里面的上下文字典中,然后就像任何其他上下文变量一样,你可以在模板中访问它。