2010-03-16 9 views
8

Ich versuche, ein Formset zu speichern, aber es scheint, Is_valid() zu umgehen, obwohl es Felder erforderlich sind.Django-Formularsatz validiert nicht

Um dies zu testen, habe ich eine einfache Form haben:

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

Aussicht:

@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)) 

Und die Vorlage:

<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> 

Was ich am Ende passiert ist hit "add" ohne einen Namen einzugeben, dann HttpRespons e ("bearbeitet") wird als scheinbar angenommen bezeichnet, es ist eine gültige Form.

Ich könnte etwas hier fehlen, aber ich kann nicht sehen, was los ist. Was ich möchte, ist genau wie jedes andere Formular, wenn das Feld einen Fehler ausspucken muss, wenn es nicht ausgefüllt ist. Irgendwelche Ideen?

Antwort

11

Heh, ich hatte genau das gleiche Problem. Das Problem ist, dass Sie ein Formset verwenden !! Formsets erlauben alle Felder in einem Formular leer zu sein. Wenn Sie jedoch zwei Felder haben und nur eines ausfüllen: , dann, erkennt es Ihre erforderlichen Daten. Dies geschieht, weil Formsets für das "Bulk-Hinzufügen" erstellt werden und manchmal nicht alle zusätzlichen Formulare auf einer Seite ausgefüllt werden müssen. Wirklich nervig; Sie können my solution hier sehen.

-4

Verwendung:

wenn keine (formset.errors): ...

statt:

wenn formset.is_valid(): ...

+1

'formset.errors' wird nicht gefüllt, bis' formset.is_valid() 'aufgerufen wird, so dass diese Lösung völlig nicht funktioniert. – kubilayeksioglu

+0

Dies ist nicht die richtige Lösung zum Posten – overflow

0

Fügen Sie 2 Zeilen hinzu.

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) 

Viel Glück!

0

Für jedes der Felder, die erforderlich sind, fügen Sie einen zusätzlichen Eintrag in dem attrs Parameter


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


 

Wie Sie sehen können, habe ich die erforderlichen = True für Djangos Formularvalidierung erhalten, sondern gibt ‚erforderlich‘:‘ erforderlich, damit die Vorlage für das Feld besteht.

Hoffe, dass hilft.