Django: forms.ChoiceField, переопределяющие формы __init__ - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь реализовать 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'

Исходя из отзывов, я должен реализовать другой __init__ с одним аргументом в forms.py? Это то, что я бы попробовал в Java.

Моя конечная цель - реализовать два ChoiceField, и второе будет зависеть от первого. Есть ли лучший способ?

1 Ответ

0 голосов
/ 07 ноября 2018

Здесь есть две ошибки: первая в AddCrimeForm. Здесь *args в заголовке __init__ требуется звездочка (*):

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

Возможно, вы также захотите сделать forms a MultipleChoiceField [Django-doc] , если хотите выбрать несколько вариантов.

По вашему мнению, вы должны создать AddCrimeForm со списком values как первый элемент, так как он определен как первый элемент в вашем 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})

Если вы не хотите обрабатывать строку запроса в своей форме, обычно она не передает request.GET в форму, так как в противном случае она будет принимать значения, определенные в строке запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...