2010-02-04 13 views
6

Ich habe eine ModelForm in meiner Django-App, die ein Forms.ModelMultipleChoiceField verwendet, das als Forms.CheckboxSelectMultiple Widget im Formular angezeigt wird. Diese ModelForm wird verwendet, um Werte für eine Viele-zu-Viele-Beziehung auszuwählen/abzuwählen. Hier ist das Problem: Wenn Sie alle Kontrollkästchen deaktivieren und das Formular speichern, wird es nicht gespeichert. Wenn Sie alle außer 1 deaktivieren, wird es ordnungsgemäß gespeichert.Django-Modell mit forms.ModelMultipleChoiceField

Gibt es irgendwelche Tricks, die mir an Modellformen und Viele-zu-Viele-Beziehungen fehlen? Habe ich einen Fehler? Ich bin neu in Django. Danke im Voraus.

Individuelle Field:

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

Modell Form:

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

Ansicht, die Form speichert:

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) 

Edit:

Mein fo rm Feld fehlt Required = False.

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

Antwort

0

Sie fügen nicht, was Ihr Modell aussieht, so dass ich vermute, dass network_messages Feld in Ihrem Modell erforderlich ist. Wenn das der Fall ist, wenn Sie versuchen, das Formular mit dem Wert dieses Felds als NULL (leer) zu senden, gibt form.is_valid()True nicht zurück und daher wird Ihre form.save() nie ausgeführt.

Haben Sie versucht, dieses Zeug von einer interaktiven Shell auszuführen, das Formular instanziieren und manuell save() es versuchen?

+0

Vielen Dank! Das war die vollständige Antwort. Ich habe es gerade herausgefunden, nachdem ich meine Frage gepostet habe. Mir fehlte Required = False auf meinem Formularfeld! \t Klasse MessageTemplateForm (forms.ModelForm): \t \t network_messages = NetworkMessageChoiceField (queryset = NetworkMessageTemplate.objects, \t \t \t \t \t \t \t \t \t \t \t \t \t Widget = forms.CheckboxSelectMultiple(), \t \t \t \t \t \t \t \t \t \t \t \t \t required = False) \t \t Klasse Meta: \t \t \t Modell = Userprofile \t \t \t Felder = ('network_messages') – Rob

+0

Excellent! Stehe gerne zur Verfügung. – jathanism