6

Django アプリに、forms.ModelMultipleChoiceField を使用する ModelForm があります。これは、フォーム上に 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',)
4

1 に答える 1

0

モデルがどのように見えるかを貼り付けていないので、network_messagesモデルのそのフィールドは必須であると推測しています。その場合、そのフィールドの値をNULL(空) にしてフォームを送信しようとすると、form.is_valid()返されないTrueため、form.save()実行されることはありません。

対話型シェルからこのようなものを実行して、フォームをインスタンス化し、手動で試みましsave()たか?

于 2010-02-04T02:58:40.667 に答える