Форма модели Django с использованием forms.ModelMultipleChoiceField

У меня есть ModelForm в моем приложении Django, которое использует Forms.ModelMultipleChoiceField, который отображается как виджет Forms.CheckboxSelectMultiple в форме. Эта ModelForm используется для выбора/отмены выбора значений для отношения «многие ко многим». Вот проблема: когда вы снимаете все галочки и сохраняете форму, она не сохраняется. Если вы снимите все, кроме 1, он сохранится правильно.

Есть ли какие-то трюки, которые мне не хватает в отношении форм модели и отношений «многие ко многим»? Я столкнулся с ошибкой? Я новичок в Джанго. Заранее спасибо.

Пользовательское поле:

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',)

person Rob    schedule 04.02.2010    source источник


Ответы (1)


Вы не вставили то, как выглядит ваша модель, поэтому я предполагаю, что поле network_messages в вашей модели обязательно. Если это так, то когда вы пытаетесь отправить форму со значением этого поля как NULL (пустое), тогда form.is_valid() не возвращает True и, следовательно, ваш form.save() никогда не выполняется.

Вы пытались выполнить этот материал из интерактивной оболочки, создать экземпляр формы и попытаться вручную save() ее?

person jathanism    schedule 04.02.2010
comment
Спасибо! Это был полностью ответ. Я только что понял это после публикации моего вопроса. Я пропустил Required=False в поле формы! класс MessageTemplateForm(forms.ModelForm): network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, widget=forms.CheckboxSelectMultiple(), required=False) class Meta: model = UserProfile fields = ('network_messages',) - person Rob; 04.02.2010
comment
Отлично! Рад помочь. - person jathanism; 04.02.2010