【问题标题】:Error in Django ModelForm. Select a valid choice. That choice is not one of the valid choicesDjango 模型表单中的错误。选择一个有效的选项。该选择不是有效选择之一
【发布时间】:2020-03-19 00:43:18
【问题描述】:

我有一个模型和一个模型表单。 ModelForm 有一个用 JQuery 实现的依赖下拉列表。每次选择性别下拉列表中的选项时,类别下拉列表都会相应更改(使用 JQuery 完成)。每当我尝试在视图中保存 ModelForm 时,都会收到一条错误消息,指出我选择的选项无效。它是否与选择性别下拉列表中的选项后添加的类别下拉列表的选项/选项有关?是不是和category字段默认的空二元组有冲突?错误发生在类别字段上。

在models.py中,

GENDER_CHOICES = [
    ('Male', 'Male'),
    ('Female', 'Female'),
]

class Person(models.Model):
    name = models.CharField(max_length=50, unique=True)
    gender = models.CharField(max_length=7, choices=GENDER_CHOICES)
    category = models.CharField(max_length=20, choices=[('', ''), ])

在forms.py中,

class PersonForm(ModelForm):

    class Meta:
        model = Person

        fields = [

            'name',
            'gender',
            'category',

        ]

在views.py中,

def personform_page(request):

    context = {}

    if request.method == 'POST':
        personform = PersonForm(request.POST)

        if personform.is_valid():
            personform.save()
            return redirect('personform_page')

        context['personform'] = personform

    else:
        personform = PersonForm()
        context['personform'] = personform

    context['male_categories'] = MALE_CATEGORIES
    context['female_categories'] = FEMALE_CATEGORIES

    return render(request, 'app1/personform_page.html', context=context)

在 app1/personform_page.html 中,

<form class="form-class" action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {% for field in personform %}

        <p>
            {{ field.label_tag }}
            {{ field }}

            {% if field.help_text %}

                <small style="color: black;"> {{ field.help_text }} </small>

            {% endif %}

            {% for error in field.errors %}

                <p style="color: red;"> {{ error }} </p>

            {% endfor %}

        </p>

    {% endfor %}

    <button class="btn btn-outline-primary" type="submit">Join</button>

</form>

<script>

    $(document).ready( function() {

        $("#id_category").hide();

        $("#id_gender").on('change', function(){

            var gender = $("#id_gender").val();

            if(gender == 'Male'){

                $('#id_category').empty();
                $("#id_category").show();

                var maleCategories = ['Male Category 1', 'Male Category 2', 'Male Category 3'];
                var length = maleCategories.length;

                var i;
                for(i=0; i < length; i++){
                    maleCategory = maleCategories[i];
                    $('#id_category').append(

                        `
                        <option value="${maleCategory}">
                            ${maleCategory}
                        </option>
                        `

                    );
                }

            }
            else if(gender == 'Female'){

                $('#id_category').empty();
                $("#id_category").show();

                var femaleCategories = ['Female Category 1', 'Female Category 2', 'Female Category 3'];
                var length = femaleCategories.length;

                var i;
                for(i=0; i < length; i++){
                    femaleCategory = femaleCategories[i];
                    $('#id_category').append(

                        `
                        <option value="${femaleCategory}">
                            ${femaleCategory}
                        </option>
                        `

                    );
                }

            }
            else{

                $('#id_category').empty();

            }

        });

    });

</script>

【问题讨论】:

    标签: python jquery html django modelform


    【解决方案1】:

    删除类别字段中的“选择”部分。通过使用“choices=[('', ''), ]”,您要求选择为空白。任何值都会失败。如果您删除,如下所示,任何值都将被接受(假设它少于 20 个字符)。

        category = models.CharField(max_length=20)
    

    【讨论】:

    • 我意识到输入与最初分配的选项不同的选项会违反完整性。因此,我在开始时用所有选项填充了选项属性,然后使用 JQuery 根据性别字段的选项选择显示适当的选项。 category = models.CharField(max_length=20, choices=get_all_choices()) 其中 get_all_choices() 被定义为返回我定义的所有选项。
    猜你喜欢
    • 2018-08-13
    • 2016-05-18
    • 2018-06-11
    • 2021-04-12
    • 2020-10-30
    • 2018-04-30
    • 2012-01-22
    • 2017-12-30
    • 2012-05-13
    相关资源
    最近更新 更多