Django:forms.ChoiceField,覆盖表单__init__

时间:2018-11-07 14:00:14

标签: django python-3.x django-forms django-views choicefield

我正在尝试使用视图中的值实现form.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,第二个依赖于第一个。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这里有两个错误:第一个是在AddCrimeForm中。 *args标头中的__init__这里需要一个星号(*):

class AddCrimeForm(forms.Form):

    tests = forms.MultipleChoiceField()

    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

如果要选择多个选择,您可能还想将forms设为MultipleChoiceField [Django-doc]

在您看来,您应该构造一个AddCrimeForm,并将values的列表作为 first 元素,因为它被定义为{{1} }:

AddCrimeForm

除非您要在表单中处理 querystring ,否则通常不会将def add_crime(request): values = [('1','um'),('2','dois'),('3','tres')] if request.method == 'POST': form = AddCrimeForm(values, request.POST) if form.is_valid(): # do stuff return redirect('show_crime') else: form = AddCrimeForm(values) return render(request, 'add_crime.html', {'form': form})传递给表单,因为否则它将采用在querystring中定义的值。