2010-03-16 15 views
8

Sto tentando di salvare un formset ma sembra che sia bypassando is_valid() anche se ci sono campi obbligatori.Il formset di Django non è valido

Per verificare questa Ho una forma semplice:

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

E il modello:

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

ciò che finisce accadendo è che premi "aggiungi" senza inserire un nome, quindi HttpRespons e ('lavorato') viene chiamato apparentemente assumendo che sia una forma valida.

Potrei mancare qualcosa qui, ma non riesco a vedere cosa c'è che non va. Quello che voglio succedere è, proprio come qualsiasi altro modulo se il campo è richiesto per sputare un errore se non è compilato. Qualche idea?

risposta

11

Heh, stavo avendo lo stesso identico problema. Il problema è che stai usando un formset !! I moduli consentono a tutti i campi in un modulo di essere vuoti. Se, tuttavia, disponi di 2 campi e ne completi uno solo, allora riconoscerà i tuoi materiali richiesti. Lo fa perché i formati sono fatti per "bulk bulk" e a volte non vuoi compilare tutti i moduli aggiuntivi in ​​una pagina. Davvero fastidioso; puoi vedere my solution qui.

-4

uso:

se non tutte (formset.errors): ...

invece di:

se formset.is_valid(): ...

+1

'formset.errors' non verrà riempito finché non viene chiamato' formset.is_valid() ', quindi questa soluzione non funzionerà. – kubilayeksioglu

+0

Questa non è la soluzione corretta per postare – overflow

0

Aggiungere 2 righe.

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) 

Buona fortuna!

0

Per ognuno dei campi che sono richiesti, aggiungere una voce in più nel parametro attrs


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


 

Come potete vedere, io sostengo il required = True per la validazione dei form di Django, ma specificare 'richiesto':' richiesto 'per il modello di insistere per il campo essere richiesto.

Spero che questo aiuti.

Problemi correlati