我有一个名为'foo'的会话var。 现在我想,根据'foo'的值,在我的cbv中加载一个特定的表单和模板。所以我需要将form_class和template_name放入switch case。
哪个功能适合这个?得到? get_form?看起来没有什么是真正适合这个的地方。
有人建议或了解其他方式吗? :)
答案 0 :(得分:3)
CBV资源管理器是您的朋友:http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/
您需要覆盖
def get_form_class(self):
和
def get_template_names(self):
答案 1 :(得分:0)
如果我使用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)
答案 2 :(得分:0)
在问我的FormView CBV change ModelForm per request非常喜欢这个问题之后,如果没有模板更改,我发现了这个并且你的问题答案
所以基本上我要总结一下 起初我用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
这是有效的答案 谢谢所有