2017-11-24 7 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> 

나는 t을 가져 오려고하지 않는다 이 값은 양식이라고하는 동일한보기 안에 만들어지기 때문에 세션을 만드는 대신 값을 사용합니다. 따라서 나는 원형 오류가 발생합니다.

이 값을 세션에 저장하고 양식으로 보내면이 순환 문제가 제기되지 않기를 바랍니다.

P. 저는 프로그래밍 초보자입니다.

[편집 됨] 뷰에 템플릿을 찾을 수 있는지 테스트 할 새 템플릿과 템플릿이 포함되었습니다.

답변

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'객체에 '세션'속성이 없습니다. 그것이 무엇인지 알 수 있습니까? – Filipe

+0

@Filipe 죄송합니다 - 죄송합니다! 보기 함수에서'form = ExampleForm (request)'줄을'form = ExampleForm (request = request)'로 대체하십시오. 키워드 인수 여야합니다. 나는 또한 대답을 업데이트했다. – hoefling

+0

문제 없음! 더 이상 오류가 발생하지 않지만 양식이 렌더링되지 않았습니다. 그게 뭔지 알아? – Filipe