2010-03-16 14 views
8

Próbuję zapisać zestaw, ale wydaje się, że pomija on wartość is_valid(), mimo że są wymagane pola.Zestaw Django nie sprawdza poprawności

Aby to sprawdzić Mam prosty formularz:

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

Widok:

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

A szablon:

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

Co kończy się dzieje to ja naciśnij "dodaj" bez wpisywania nazwy, a następnie HttpRespons e ("pracował") nazywane jest get, na pozór zakładając, że jest to poprawna forma.

Może brakuje mi czegoś tutaj, ale nie widzę, co jest nie tak. To, co chcę zrobić, to tak jak każda inna forma, jeśli pole jest wymagane do wypowiedzenia błędu, jeśli nie jest wypełnione. Jakieś pomysły?

Odpowiedz

11

Heh, miałem dokładnie ten sam problem. Problem polega na tym, że używasz zestawu! Zestawy formularzy pozwalają na puste pola wszystkich. Jeśli jednak masz 2 pola i wypełnisz tylko jeden, , a następnie, rozpoznasz wymagane pliki. Dzieje się tak, ponieważ zestawy formularzy są tworzone dla "zbiorczego dodawania", a czasami nie chcesz wypełniać wszystkich dodatkowych formularzy na stronie. Naprawdę denerwujące; możesz zobaczyć tutaj: my solution.

-4

zastosowanie:

jeśli nie Obojętnie (formset.errors): ...

zamiast:

jeśli formset.is_valid(): ...

+1

'formset.errors' nie zostanie wypełnione, dopóki nie zostanie wywołane' formset.is_valid() ', więc to rozwiązanie całkowicie nie zadziała. – kubilayeksioglu

+0

To nie jest poprawne rozwiązanie do publikowania – overflow

0

Dodaj 2 linie.

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) 

Powodzenia!

0

Dla każdej z dziedzin, które są wymagane, dodać dodatkowy wpis w parametrze attrs


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


 

Jak widać, ja utrzymać wymagany = True walidacji formularza Django, ale określenie „wymagana”:” wymagane "aby szablon wymagał, aby pole było wymagane.

Nadzieję, że pomaga.

Powiązane problemy