2010-03-16 72 views
8

我想保存一個formset,但它似乎繞過is_valid(),即使有必需的字段。Django formset不驗證

爲了驗證這一點,我有一個簡單的表格:

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

的觀點:

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

而且模板:

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

什麼結束了發生的事情是我點擊「添加」而不輸入名稱,然後HttpRespons e('工作')被稱爲似乎認爲它是有效的形式。

我可能在這裏錯過了一些東西,但我看不出有什麼問題。我想要發生的是,就像任何其他形式,如果該字段需要吐出一個錯誤,如果它沒有填寫。任何想法?

回答

11

嘿,我有這個完全相同的問題。問題是你正在使用formset! Formsets允許所有表單中的字段爲空。但是,如果您有兩個字段,並且只填寫一個,那麼然後它會識別您需要的東西。它是這樣做的,因爲表單集是爲了「批量添加」而製作的,有時候你不想在頁面上填寫所有額外的表單。真的很煩人;你可以在這裏看到my solution

-4

使用:

如果沒有任何(formset.errors):...

代替:

如果formset.is_valid():...

+1

'formset.errors'在調用'formset.is_valid()'之前不會被填充,所以這個解決方案完全無法工作。 – kubilayeksioglu 2013-04-27 21:37:58

+0

這不是正確的解決方案 – overflow 2016-10-26 14:09:38

0

添加2行。

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) 

祝你好運!

0

對於每個需要的字段,在ATTRS參數


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


 

添加額外的條目正如你所看到的,我維護所需= True以Django的表單驗證,但指定「需要」:」要求「模板堅持要求現場。

希望有所幫助。