2010-02-04 34 views
6

Tengo un ModelForm en mi aplicación Django que usa un forms.ModelMultipleChoiceField, que se muestra como un widget forms.CheckboxSelectMultiple en el formulario. Este ModelForm se usa para seleccionar/deseleccionar valores para una relación de muchos a muchos. Este es el problema: cuando deselecciona todas las casillas de verificación y guarda el formulario, no se guarda. Si desmarca todo menos 1, guarda correctamente.Formulario de modelo Django utilizando forms.ModelMultipleChoiceField

¿Hay algún truco que me falta aquí acerca de los modelos y las relaciones de muchos a muchos? ¿Me encuentro con un error? Soy nuevo en Django. Gracias por adelantado.

campo personalizado: Formulario

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

Modelo:

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

Ver que salva forma:

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) 

Editar:

mis FO rm campo faltante Required = False.

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

Respuesta

0

Usted no pegar lo que su modelo se parece, así que supongo que se requiere network_messages campo en su modelo. Si ese es el caso, cuando intente enviar el formulario con el valor de ese campo como NULL (vacío), entonces form.is_valid() no devuelve True y por lo tanto su form.save() nunca se está ejecutando.

¿Ha intentado ejecutar esto desde un intérprete de comandos interactivo, instanciando el formulario e intentando manualmente save()?

+0

¡Gracias! Esa fue completamente la respuesta. Lo descubrí después de publicar mi pregunta. Me faltaba Required = False en mi campo de formulario. \t clase 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 de = forms.CheckboxSelectMultiple(), \t \t \t \t \t \t \t \t \t \t \t \t \t requerido = False) \t \t clase Meta: modelo \t \t \t = UserProfile \t \t \t Fields = ('network_messages',) – Rob

+0

Excelente! Contento de estar en servicio. – jathanism

Cuestiones relacionadas