2017-11-24 20 views
1

私は、forms.pyでviews.pyで設定されたセッションを呼びたいと思っています。それは可能ですか?Django - views.pyとは別のモジュールでセッションを呼び出す方法は?

私はそれをやろうとしましたが、私は「要請」に関するいくつかの問題に直面しました。

forms.py

from django import forms 


class NormalForm(forms.Form): 

    options = [ 
     ('TEST','TEST'), 
    ] 

    options_normalform = forms.ChoiceField(required=False, choices=options,widget=forms.RadioSelect(attrs={'class':'example_form'}), label='') 

class ExampleForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(ExampleForm, self).__init__(*args, **kwargs) 

     self.option_a = self.request.session['my_session'] 

    self.options_list = [ 
     ('a', self.option_a), 
     ('b', 'b'), 
     ('c', 'c'), 
    ] 

    self.options_form = forms.ChoiceField(required=False, choices=self.options_list,widget=forms.RadioSelect(attrs={'class':'example_form'}), label='') 

views.py

from django.shortcuts import render 
from .forms import ExampleForm, NormalForm 

def example(request): 
    option_a = '123' 
    request.session['my_session'] = option_a 

    normalform = NormalForm 
    form = ExampleForm(request=request) 
    context = { 
     'form': form, 
     'normalform': normalform, 
    } 

    return render(request, 'index.html', context) 

テンプレート

<!DOCTYPE html> 
<html> 
    <head> 
     <title>My App</title> 
    </head> 
    <body>  
     <!-- Header --> 
     <header> 
      <h1 id="logo">MY APP</h1> 
     </header> 


     <!-- Options form --> 
     <div id="forms"> 
      <form id="normalform" method="post"> 
       {% csrf_token %} 
       {{normalform}} 
      </form> 
      <form id="form" method="post"> 
       {% csrf_token %} 
       {{form}} 
      </form> 
     </div> 
     <!-- End of options form --> 


     <!-- Footer --> 
     <footer id="main-footer"> 
      <p>Copyright &copy; 2017-2017 | my APP </p> 
     </footer> 
     <!-- End of Footer --> 
    </body> 
</html> 

私はトンを輸入しようとしないでくださいこの値はフォームと呼ばれるのと同じビューの内部に作成されるため、セッションを作成する代わりに値を設定します。したがって、私は循環的なエラーが発生します。

この値をセッションに保存してからフォームに送信しても、この問題は発生しません。

P.S.私はプログラミングの初心者です。

[編集済み]ビューにテンプレートが見つかるかどうかをテストするためのテンプレートと新しいフォームが含まれていました。

答えて

1

最初に、フォームクラスを書き換えて、コンストラクタでリクエストオブジェクトを受け取ってフィールドに格納するようにします。他のすべてのプロパティは、後に初期化されます。

class ExampleForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(ExampleForm, self).__init__(*args, **kwargs) 

     self.option_a = self.request.session['my_session'] 

     self.options_list = [ 
      ('a', self.option_a), 
      ('b', 'b'), 
      ('c', 'c'), 
     ] 

     self.fields['options_form'] = forms.ChoiceField(required=False, choices=self.options_list, widget=forms.RadioSelect(attrs={'class':'example_form'}), label='') 

今、あなたのビューでは、フォームオブジェクトをインスタンス化し、コンストラクタ呼び出しで要求を渡す必要があります。コンテキストはフォームインスタンスを受信する必要がありますが、フォームは表示されません。

def example(request): 
    option_a = '123' 
    request.session['my_session'] = option_a 
    form = ExampleForm(request=request) 
    context = { 
     'form': form, 
    } 
    return render(request, 'example/index.html', context) 
+0

ご回答ありがとうございます。ほんとうにありがとう。私はエラーが発生しています:self.option_a = self.request.session ['my_session'] AttributeError: 'NoneType'オブジェクトに 'session'属性がありません。それが何であるか知っていますか? – Filipe

+0

@Filipeおっと、申し訳ありません - 私の悪い!ビュー関数の 'form = ExampleForm(request)'行を 'form = ExampleForm(request = request)'に置き換えます。それはキーワードの引数でなければなりません。私も答えを更新しました。 – hoefling

+0

問題ありません!もうエラーは出ませんが、フォームは表示されません。それが何であるか知っていますか? – Filipe

関連する問題