MultipleChoiceField / CheckboxSelectMultiple值未在绑定表单上恢复

时间:2017-08-25 10:33:18

标签: django

我正在构建'编辑'我的表格页面。此页面应显示已保存数据的表单,因此表单预先填充了已保存的数据。 对于大多数字段,它适用于大多数字段,但我遇到了MultipleChoiceField / CheckboxSelectMultiple值无法恢复的问题。因此,不是使用保存的表单中的数据检查相应的复选框,而是取消选中它们。那是为什么?

forms.py

class MemberForm( forms.ModelForm ):

    # ......

    MODEL_CATEGORIES = (
        ('advisor', 'advisor'),
        ('member', 'member'),
        ('admin', 'admin'),
    )


    model_categories = forms.MultipleChoiceField(
            widget = forms.CheckboxSelectMultiple,
            choices = MODEL_CATEGORIES
    )

    class Meta:
        model = Member
        fields = [ 'model_categories' ]

模型

class Member( models.Model ):

    model_categories = models.CharField(
            max_length = 255,
            null = True,
            blank = True )

控制器

def profile_edit_form( request ):
    user = request.user or None

    # Get user member profile instance
    instance = get_object_or_404( Member, author = user )

    form = MemberForm( request.POST or None, instance = instance )

    context = {
        "form"    : form,
        "instance": instance
    }

    if form.is_valid():
        # ...
        return redirect( 'profile_display' )
    else:
        # Initial form display, and redisplay of invalid form
        return render( request, 'profile_edit_form_view.html', context )

模板

<form action="/accounts/profile-edit-form/" method="post">
    {% csrf_token %}

    {{ form }}


    <input type="submit" value="Submit"/>
</form>

2 个答案:

答案 0 :(得分:1)

您可以尝试使用

形式的initial
form = MemberForm( request.POST or None, instance = instance, 
                                         initial={'model_categories': 'advisor'})

答案 1 :(得分:0)

它看起来像是Django的“功能”,并且不会得到修复: https://code.djangoproject.com/ticket/28531

如果您在模型中使用Postgres数据库,使用ARRAY字段而不是简单的字段,解决方案很简单:

    model_categories = ArrayField( models.CharField( max_length = 200 ), blank = True, null = True )

从这种类型的模型字段中正确存储和恢复多选值,无需任何数据处理。