Django - 如何在不同于 views.py 的模块中调用会话?

Django - How to call a session in a module different than views.py?

我想调用 forms.py 中设置在 views.py 的会话。这可能吗?

我尝试这样做,但遇到了 'request' 的一些问题。

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。我是编程初学者。

[已编辑] 它包含模板和一个新表单以测试视图是否能够找到模板。

首先,我们重写表单class,使其在构造函​​数中接收请求对象,并将其存储在一个字段中。之后将初始化所有其他属性:

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='')

现在,在您的视图中,您必须实例化一个表单对象并在构造函数调用中传递请求。请注意,上下文应该接收表单实例而不是 class 否则表单将不会呈现:

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)