【问题标题】:Django model form using forms.ModelMultipleChoiceField使用 forms.ModelMultipleChoiceField 的 Django 模型表单
【发布时间】:2011-01-12 21:54:57
【问题描述】:

我的 Django 应用程序中有一个 ModelForm,它使用 forms.ModelMultipleChoiceField,它在表单上显示为 forms.CheckboxSelectMultiple 小部件。此 ModelForm 用于选择/取消选择多对多关系的值。这是问题所在:当您取消选中所有复选框并保存表单时,它不会保存。如果您取消选中除 1 之外的所有选项,则它会正确保存。

关于模型表单和多对多关系,我在这里缺少什么技巧吗?我遇到错误了吗?我是 Django 的新手。提前致谢。

自定义字段:

class NetworkMessageChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.display_message    

模型形式:

class MessageTemplateForm(forms.ModelForm):
    network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, 
                                             widget=forms.CheckboxSelectMultiple())        
    class Meta:
        model = UserProfile
        fields = ('network_messages',)

保存表单的视图:

def save_message_templates(request, extra_context=dict()):
    try:
        profile_obj = request.user.get_profile()
    except ObjectDoesNotExist:
        profile_obj = UserProfile(user=request.user)

    if request.method == 'POST':
        form = MessageTemplateForm(request.POST, instance=profile_obj)
        if form.is_valid():
            form.save()
            return redirect('/')

    return index(request, message_template_form=form)

编辑:

我的表单域缺少Required=False。

class MessageTemplateForm(forms.ModelForm):
    network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, 
                                                 widget=forms.CheckboxSelectMultiple(),
                                                 required=False)        
    class Meta:
        model = UserProfile
        fields = ('network_messages',)

【问题讨论】:

    标签: django checkbox django-forms many-to-many modelform


    【解决方案1】:

    您没有粘贴模型的外观,所以我猜您模型中的 network_messages 字段是必需的。如果是这种情况,那么当您尝试提交该字段值为NULL(空)的表单时,form.is_valid() 不会返回True,因此您的form.save() 永远不会被执行。

    您是否尝试过从交互式 shell 执行这些内容、实例化表单并尝试手动 save() 它?

    【讨论】:

    • 谢谢!这完全是答案。我只是在发布我的问题后才弄清楚。我的表单字段中缺少Required=False!类 MessageTemplateForm(forms.ModelForm): network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, widget=forms.CheckboxSelectMultiple(), required=False) 类 Meta: model = UserProfile fields = ('network_messages',)
    • 太棒了!很高兴为您服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多