我有一个名为“foo”的会话变量。现在我想根据“foo”的值在我的 cbv 中加载特定的表单和模板。所以我需要将 form_class 和 template_name 放入一个 switch case。
哪个功能适合这个?得到?获取表格?看起来没有什么是真正合适的地方。
任何人的建议或知道另一种方式?:)
CBV 浏览器是你的朋友:http ://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/
你需要覆盖
def get_form_class(self):
和
def get_template_names(self):
在询问我的FormView CBV 更改 ModelForm 每个请求之后,非常喜欢这个问题,只是没有更改模板,我找到了这个和你的答案
所以基本上我首先要总结一下我测试了Denny Crane的这个答案
class Foo(FormView):
def dispatch(self, request, *args, **kwargs):
self.var = request.session['sessionvar']['var']
if self.var == some_value:
form_class = form1
template_name = template1
elif self.var == another_value:
form_class = form2
template_name = template2
[...]
return super(Foo, self).dispatch(request, *args, **kwargs)
我确实需要覆盖
def get_form_class(self):
和
def get_template_names(self):
为此,我需要的正是没有模板部分,因为在我的情况下,我想保持相同的模板,所以这两者的结合确实有效!但是后来我缝了@Serafeim评论
小心 - 这不是 django 的好用法!如果您不想在两个函数中重复您的条件,只需定义一个新函数,该函数将包含 > 您的条件并返回 True/False。现在这个函数可以在 > > get_form_class 和 get_template_names 中使用 :)
我把一切都改成了
仅此代码
def get_form_class(self):
self.step = self.request.GET.get('step')
# for now I am getting this with request.get, till I will get the
# grip on session :) my first week on django and web-dev in general
if not self.step:
self.step = 'step1'
self.form_class = FORM[self.step] #FORM = dict{'step#': ModelForm}
return self.form_class
这是有效的答案谢谢大家
如果我要使用 get_form_class() 和 get_template_names 我将不得不在这两个函数中重复我的条件。那将是多余的。这不是首选。
我想出了另一个不重复代码片段的解决方案。
class Foo(FormView):
def dispatch(self, request, *args, **kwargs):
self.var = request.session['sessionvar']['var']
if self.var == some_value:
form_class = form1
template_name = template1
elif self.var == another_value:
form_class = form2
template_name = template2
[...]
return super(Foo, self).dispatch(request, *args, **kwargs)