моя форма Django не проверяется при использовании __init__ для динамического радиополя - PullRequest
0 голосов
/ 20 сентября 2019

Я написал форму, в которой есть переключатель, значения которого я предоставляю при инициализации формы.Форма отображается идеально, но когда мне нужно использовать значения, отправленные через форму, я не могу, потому что она не проверяется.

forms.py

from django import forms

class voteForm(forms.Form):
    def __init__(self,candidates, *args, **kwargs):
        super(voteForm,self).__init__(*args, **kwargs)
        self.fields['Candidate'] = forms.ChoiceField(choices=candidates, widget=forms.RadioSelect)

views.py

from django.shortcuts import render,redirect
from register.models import Candidate, Voter
from voting.models import Vote
from voting.forms import voteForm
from django.http import HttpResponse

def index(request):
    context={}
    if request.method=='POST':
        form = voteForm(request.POST)
        if form.is_valid():
            # do something with data
            return HttpResponse('Success')
    voterid=1
    context['voter']=Voter.objects.get(id=voterid)
    request.session['id']=voterid
    candidates=Candidate.objects.filter(region=context['voter'].region).values_list('id','name')
    form = voteForm(candidates)
    context['form']=form
    return render(request,'voting/index.html',context)

Редактировать.

HTML код

<h1>Vote</h1>
{{ voter.name }}
{{ voter.region }}
<form action="/vote/" method="post" enctype="multipart/form-data">
	{% csrf_token %}
	{{ form.as_p }}
	<input type="submit" value="Submit">
</form>

1 Ответ

0 голосов
/ 20 сентября 2019

Проблема здесь заключается в списке выбора кандидатов , который вы передаете в форму при создании.Метод, который вы здесь использовали, не подходит, и поэтому форма не может получить список выбора и, следовательно, не проходит проверку.У вас есть 2 варианта здесь.Вы можете либо определить список выбора кандидатов внутри forms.py и использовать его, либо использовать подходящий метод для передачи списка кандидатов в форму.

Вариант 1:

В forms.py :

     # dummy candidates list
    candidates = [
        (Male, 'Male'),
        (Female, 'Female'),
    ]


    class VoteForm(forms.Form):
        fields = ('Candidate')

        def __init__(self, *args, **kwargs):
            super(VoteForm, self).__init__(*args, **kwargs)

            self.fields['Candidate'] = forms.ChoiceField(choices=candidates, widget=forms.RadioSelect)

А в views.py просто удалитеПараметр кандидатов из метода VoteForm ().

Вариант 2 :

Здесь уже есть ответ здесь .Вы можете проверить это.

Я протестировал Вариант 1 , и он работает правильно.

...