2010-03-16 11 views
8

Estoy tratando de guardar un formset pero parece estar omitiendo is_valid() aunque haya campos obligatorios.Django formset no valida

Para probar esto tengo una forma sencilla:

class AlbumForm(forms.Form): 
    name = forms.CharField(required=True) 

La vista:

@login_required 
def add_album(request, artist): 
    artist = Artist.objects.get(slug__iexact=artist) 
    AlbumFormSet = formset_factory(AlbumForm) 
    if request.method == 'POST': 
    formset = AlbumFormSet(request.POST, request.FILES) 
    if formset.is_valid(): 
     return HttpResponse('worked') 
    else: 
    formset = AlbumFormSet() 
    return render_to_response('submissions/addalbum.html', { 
    'artist': artist, 
    'formset': formset, 
    }, context_instance=RequestContext(request)) 

Y la plantilla:

<form action="" method="post" enctype="multipart/form-data">{% csrf_token %} 
{{ formset.management_form }} 
{% for form in formset.forms %} 
    <ul class="addalbumlist"> 
    {% for field in form %} 
    <li> 
     {{ field.label_tag }} 
     {{ field }} 
     {{ field.errors }} 
    </li> 
    {% endfor %} 
    </ul> 
{% endfor %} 
    <div class="inpwrap"> 
    <input type="button" value="add another"> 
    <input type="submit" value="add"> 
    </div> 
</form> 

Lo que termina pasando es que presiona "agregar" sin ingresar un nombre, luego HttpRespons e ('trabajado') recibe un llamado aparentemente asumiendo que es una forma válida.

Me podría estar perdiendo algo aquí, pero no puedo ver qué pasa. Lo que quiero que suceda es, al igual que cualquier otra forma, si se requiere que el campo escuche un error si no se completa. ¿Alguna idea?

Respuesta

11

Heh, estaba teniendo exactamente el mismo problema. ¡El problema es que estás usando un formset! Los conjuntos de formularios permiten todos los campos en un formulario para estar en blanco. Sin embargo, si tiene 2 campos y completa solo uno, , entonces, reconocerá sus productos necesarios. Hace esto porque los conjuntos de formularios están hechos para "agregar en bloque" y, a veces, no desea completar todos los formularios adicionales en una página. Realmente molesto; puedes ver my solution aquí.

-4

uso:

si no cualquier formset.errors(): ...

en lugar de:

si formset.is_valid(): ...

+1

'formset.errors' no se llenará hasta que se llame a' formset.is_valid() ', por lo que esta solución no funcionará por completo. – kubilayeksioglu

+0

Esta no es la solución correcta para publicar – overflow

0

Agregue 2 líneas.

if request.method == 'POST': 
    def initial_form_count(self): return 10 # the number of forms 
    AlbumFormSet.initial_form_count = initial_form_count 
    formset = AlbumFormSet(request.POST, request.FILES) 

¡Buena suerte!

0

Para cada uno de los campos que se requieren, añadir una entrada adicional en el parámetro attrs


    resident_status = forms.ChoiceField(widget=forms.Select(
     attrs={'class': 'form-control', 'required': 'required'}), choices=President.RESIDENT_STATUS, 
     required=True) 


 

Como se puede ver, mantengo la requerida = True para la validación de formularios de Django, sino especificar 'necesaria':' requerido 'para que la plantilla insista para que el campo sea requerido.

Espero que ayude.

Cuestiones relacionadas