「foo」という名前のセッション変数があります。ここで、「foo」の値に応じて、cbv に特定のフォームとテンプレートをロードしたいと思います。そのため、form_class と template_name を switch ケースに入れる必要があります。
これに適した機能はどれですか? 得る?get_form? これに本当に適した場所はないように見えます。
誰か提案や別の方法を知っていますか? :)
テンプレートを変更せずに、この質問と非常によく似た要求ごとに FormView CBV の変更 ModelFormを依頼した後、私はこれとあなたの答えを見つけました
だから基本的に私はそれをすべて要約するつもりです 最初に私はデニー・クレーンによってこの答えをテストしました
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):
これが機能するために、まさにテンプレート部分なしで必要なものでした。私の状況では、同じテンプレートを維持したいので、その2つの組み合わせが機能しました! しかし、私は@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
そして、これはすべてのおかげで有効な答えです