问题描述
我正在制作测验应用程序,我想制作一个动态表格来呈现问题。
我在问题中使用了两个小部件(widgets.RadioSelect
和widgets.CheckBoxSelectMultiple
)来呈现问题的选择。当我提交表单时,出现以下错误:
选择一个有效的选择。['option1','option2']不是可用的选择之一。
仅由第二个窗口小部件的问题引起,例如:widgets.CheckBoxSelectMultiple
。 RadioSelect成功提交。
forms.py:
class QuestionForm(forms.Form):
def __init__(self,fields,*args,**kwargs):
super(QuestionForm,self).__init__(*args,**kwargs)
# Init form fields
for field in fields:
self.fields[field['name']] = forms.ChoiceField(
label=field['label'],choices=field['choices'],widget=getattr(widgets,field['widget']),required=False
)
views.py:
def quiz(request,quiz_id):
quiz = get_object_or_404(QCM,pk=quiz_id)
if request.method == 'POST':
if request.POST['action'] == 'Save':
form = QuestionForm(data=request.POST)
if form.is_valid():
print('form is valid :)')
form.save()
else:
print('form is not valid :(')
else:
form = QuestionForm()
context = {
'form': form,}
return render(request,'quiz/quiz.html',context)
quiz.html
{% extends "quiz/first.html" %}
{% load staticfiles %}
{% block main %}
<form method="POST" class="form-horizontal" id="qcm_form" enctype="multipart/form-data">
<div class="row">
<div class="col-md-12">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label class="field-label" for="id_{{ field.name }}">{{ field.label }}{% if field.field.required %} <span class="text-danger">*</span>{% endif %}</label>
{{ field }}
</div>
{% endfor %}
</div>
</div>
<input type="submit" class="btn btn-primary" name="action" value="Save">
</form>
{% endblock main %}
任何帮助将不胜感激。
解决方法
问题出在我使用的forms.Field
子类(ChoiceField
)中,女巫只接受字符串值,而不接受列表。这就解释了为什么单选按钮可以工作,因为它们提交了一个字符串值,而CheckboxSelectMultiple却没有,因为它提交了一个列表。
我已经修改了生成的字段列表,使其也包含forms.Field
子类。
当我有多个值时,我会使用forms.MultipleChoiceField
;如果只是一个值,我会分配forms.ChoiceField
。