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 © 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)
我想调用 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 © 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)