Django表单返回无效

时间:2017-10-04 22:03:57

标签: python django django-models django-forms

我正在尝试实现一个包含字段复选框选项的表单,用户可以为表单中的特定字段选择多个复选框,并且所有检查标记的值都应该在POST请求中发送。

views.py表示当我尝试提交表单时表单无效。它无效的原因是Select a valid choice. ['top', 'mid'] is not one of the available choices.

当我只选择一个复选框时,我收到类似的错误。

这是我的部分models.py

from django.db import models
LEAGUE_ROLES = (
    ('top','Top'),
    ('mid','Mid'),
    ('jungle','Jungle'),
    ('bottom','Bottom/ADC'),
    ('support','Support'),
)
class CreatePosting(models.Model)
    createPostingOpenRoles = models.CharField(max_length = 10, choices=LEAGUE_ROLES, default=None)
    def __str__(self):   # __unicode__ on Python 2
        return self.title

这是我的部分forms.py

class TeamPostingCreateForm(ModelForm):
    class Meta:
        model = CreatePosting
        widgets = {
            'createPostingOpenRoles': forms.CheckboxSelectMultiple(),
        }
        fields = '__all__'
    def __init__(self, *args, **kwargs):
        super(TeamPostingCreateForm, self).__init__(*args, **kwargs)

这是我的部分views.py

def createposting(request):
    UserTeamPostingCreateForm = TeamPostingCreateForm()
    if request.method == "POST":
        UserTeamPostingCreateForm = TeamPostingCreateForm(request.POST)
        if UserTeamPostingCreateForm.is_valid():
            logger.error("valid form")
        else:
            #print form error
            logger.error(UserTeamPostingCreateForm.errors)
    variables = { 'form': UserTeamPostingCreateForm }
    return render(request, 'createposting.html', variables)

在我的模板中,我将其用于表单字段

{{ form.createPostingOpenRoles }}

如果您需要更多代码,请与我们联系。 我试着研究解决方案,但没有什么对我有用。

感谢您的帮助,谢谢

更新

所以我打印出views.py将使用此

呈现给模板的选项
    logger.error(UserTeamPostingCreateForm.fields['createPostingOpenRoles'].choices)

我得到了这个输出

[('top', 'Top'), ('mid', 'Mid'), ('jungle', 'Jungle'), ('bottom', 'Bottom/ADC'), ('support', 'Support')]

然后,当我提交带有复选框'Top'和'Mid'的表单时,我认为这是一个无效的表单,因为:

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

1 个答案:

答案 0 :(得分:0)

这是因为您尝试将两个文本值的列表传递到CharField。列表(显而易见的原因)是CharField的无效选择。如果您想允许多个选项,请考虑使用JSONField(仅限postgres)或MultipleChoiceField

MultipleChoiceField定义类似于

createPostingOpenRoles = models.MultipleChoiceField(choices=LEAGUE_ROLES)

"空" MultipleChoiceField的值是一个空列表([]