python - Django 选择一个有效的选项。[...] 不是可用的选项之一。以动态生成的形式

标签 python django django-forms dynamic-forms

我正在制作一个测验应用程序,我想制作一个动态表单来呈现问题。

我在问题中使用两个小部件(widgets.RadioSelectwidgets.CheckboxSelectMultiple)来呈现问题的选择。当我提交表单时,出现以下错误:

Select a valid choice.['option1', 'option2'] is not one of the available choices.

仅从第二个小部件的问题中产生,例如:widgets.CheckboxSelectMultiple。 RadioSelect 提交成功。

表单.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)

测验.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

关于python - Django 选择一个有效的选项。[...] 不是可用的选项之一。以动态生成的形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63961195/

相关文章:

python - 当一个序列在 df 中的簇中时删除原始数据

python - pinax.apps.accounts、idios 配置文件和 django.auth.User 之间的区别

python - Django-Nginx 补丁请求 :405 Method \"METHOD_OTHER\" not allowed

python - Django 文件 uploader 抛出错误 "cannot pickle ' _io.BufferedRandom' object"同时使用 celery 上传更多感谢 2.5mb 的图像

django - 带有随 secret 码的Redis AUTH

python - 如何正确地将对数比例图与背景图像结合起来?

python - OpenCV VideoCapture 无法从流中读取

python - django-autocomplete-light 使用 SQL Alchemy 而不是 Django ORM

python - 将所有自定义验证放入模型中有什么问题?

python - Django如何在__gt和__range之间动态选择