Django:forms.ChoiceField,覆盖表单 __init__
Django: forms.ChoiceField, overriding forms __init__
我正在尝试使用视图中的值实现 forms.ChoiceField()。
如果我在 forms.py 中声明选项,我已经可以做到,但这不是我需要的。
views.py:
def add_crime(request):
values = [('1','um'),('2','dois'),('3','tres')]
if request.method == 'POST':
form = AddCrimeForm(request.POST, values)
if form.is_valid():
# do stuff
return redirect('show_crime')
else:
form = AddCrimeForm(request.GET)
return render(request, 'add_crime.html', {'form': form})
forms.py:
class AddCrimeForm(forms.Form):
tests = forms.ChoiceField()
def __init__(self, testList, args, **kwargs):
self.testList = testList
super(AddCrimeForm,self).__init__(*args, **kwargs) # testList not in args!
self.fields['tests'].widget = forms.CheckboxSelectMultiple()
self.fields['tests'].choices = self.testList
错误:
AttributeError: 'tuple' object has no attribute 'get'
根据反馈,我是否必须使用 forms.py 中的一个参数实现另一个 __init__
?这就是我在 Java.
中会尝试的
我的最终目标是实现两个 ChoiceField,第二个将依赖于第一个。有没有更好的方法?
这里有两个错误:第一个错误在AddCrimeForm
。这里*args
在__init__
header需要一个星号(*
):
class AddCrimeForm(forms.Form):
tests = forms.<b>MultipleChoiceField</b>()
def __init__(self, testList, <b>*args</b>, **kwargs):
self.testList = testList
super(AddCrimeForm,self).__init__(*args, **kwargs) # testList not in args!
self.fields['tests'].widget = forms.CheckboxSelectMultiple()
self.fields['tests'].choices = self.testList
如果您想 select 多个 选择,您可能还想将 forms
设为 MultipleChoiceField
[Django-doc]。
在您看来,您应该构建一个 AddCrimeForm
,其中 values
的列表作为 first 元素,因为它被定义为第一个元素你的 AddCrimeForm
:
def add_crime(request):
values = [('1','um'),('2','dois'),('3','tres')]
if request.method == 'POST':
form = AddCrimeForm(<b>values, </b>request.POST)
if form.is_valid():
# do stuff
return redirect('show_crime')
else:
form = AddCrimeForm(<b>values</b>)
return render(request, 'add_crime.html', {'form': form})
除非您想在表单中处理 querystring,否则通常不会将 request.GET
传递给表单,否则它将采用在查询字符串。
我正在尝试使用视图中的值实现 forms.ChoiceField()。 如果我在 forms.py 中声明选项,我已经可以做到,但这不是我需要的。
views.py:
def add_crime(request):
values = [('1','um'),('2','dois'),('3','tres')]
if request.method == 'POST':
form = AddCrimeForm(request.POST, values)
if form.is_valid():
# do stuff
return redirect('show_crime')
else:
form = AddCrimeForm(request.GET)
return render(request, 'add_crime.html', {'form': form})
forms.py:
class AddCrimeForm(forms.Form):
tests = forms.ChoiceField()
def __init__(self, testList, args, **kwargs):
self.testList = testList
super(AddCrimeForm,self).__init__(*args, **kwargs) # testList not in args!
self.fields['tests'].widget = forms.CheckboxSelectMultiple()
self.fields['tests'].choices = self.testList
错误:
AttributeError: 'tuple' object has no attribute 'get'
根据反馈,我是否必须使用 forms.py 中的一个参数实现另一个 __init__
?这就是我在 Java.
我的最终目标是实现两个 ChoiceField,第二个将依赖于第一个。有没有更好的方法?
这里有两个错误:第一个错误在AddCrimeForm
。这里*args
在__init__
header需要一个星号(*
):
class AddCrimeForm(forms.Form):
tests = forms.<b>MultipleChoiceField</b>()
def __init__(self, testList, <b>*args</b>, **kwargs):
self.testList = testList
super(AddCrimeForm,self).__init__(*args, **kwargs) # testList not in args!
self.fields['tests'].widget = forms.CheckboxSelectMultiple()
self.fields['tests'].choices = self.testList
如果您想 select 多个 选择,您可能还想将 forms
设为 MultipleChoiceField
[Django-doc]。
在您看来,您应该构建一个 AddCrimeForm
,其中 values
的列表作为 first 元素,因为它被定义为第一个元素你的 AddCrimeForm
:
def add_crime(request):
values = [('1','um'),('2','dois'),('3','tres')]
if request.method == 'POST':
form = AddCrimeForm(<b>values, </b>request.POST)
if form.is_valid():
# do stuff
return redirect('show_crime')
else:
form = AddCrimeForm(<b>values</b>)
return render(request, 'add_crime.html', {'form': form})
除非您想在表单中处理 querystring,否则通常不会将 request.GET
传递给表单,否则它将采用在查询字符串。