2009-11-24 79 views
1

我已經使用modelformset_factory創建了一個簡單的聯繫表單,使用數據庫模型在視圖中構建表單。我遇到的問題是is_valid()在save()不起作用之前檢查。當我用空字段提交表單時,它仍然通過is_valid()並嘗試寫入數據庫。Django is_valid()不適用於modelformset_factory

我希望is_valid()檢查在字段爲空時失敗,以便用戶可以通過錯誤消息重新定向到表單。我相信這是一個簡單的解決方案。你知道我在代碼中缺少什麼嗎?

謝謝。

代碼:

models.py

class Response(models.Model): 
    name = models.CharField(max_length=50,verbose_name='Your Name:') 
    email = models.CharField(max_length=50,verbose_name='Email:') 
    phone = models.CharField(max_length=50,verbose_name='Phone Number:') 
    apt_size = models.CharField(max_length=25, 
           choices=APT_CHOICES, 
           verbose_name='Apt Size:') 
    movein_at= models.DateField(verbose_name='Desired Move-In Date') 
    community = models.CharField(max_length=50, 
           choices=COMMUNITY_CHOICES, 
           verbose_name='Community You Are Interested In:') 
    referred_by = models.CharField(max_length=50, 
            choices=REFERRED_CHOICES, 
            verbose_name='Found Us Where?') 
    referred_other = models.CharField(blank=True,max_length=50,verbose_name='If Other:') 
    comments = models.TextField(verbose_name='Comments:') 
    created_at = models.DateTimeField(auto_now_add=True) 
    def __unicode__(self): 
     return self.name 

views.py

from summitpark.contact.models import * 
from django.shortcuts import render_to_response 
from django.forms.models import modelformset_factory 

def form(request): 
    contact_form_set = modelformset_factory(Response,fields=('name','email','phone', 
                  'apt_size','movein_at', 
                  'community','referred_by', 
                  'comments'), 
                exclude=('id')) 
    if request.method == 'POST': 
     formset = contact_form_set(request.POST) 
     if formset.is_valid(): 
      formset.save() 
      return render_to_response('contact/confirm.html') 
     else: 
      return render_to_response('contact/form.html',{'formset':formset}) 
    else: 
     formset = contact_form_set(queryset=Response.objects.none()) 
     return render_to_response('contact/form.html',{'formset':formset} 

解決方案:

class BaseContactFormSet(BaseModelFormSet): 
def clean(self): 
    if any(self.errors): 
     return 
    for form in self.forms: 
     name = form['name'].data 
     if not name: 
      raise forms.ValidationError, "Please Complete the Required Fields 

回答

2

你的問題是,提供0個項目是一個有效的formset,沒有最低限度的驗證。我會提供一個自定義的BaseModelFormset子類,它的clean()方法只檢查了至少一個obj。

+0

您的解決方案可行,但我無法在視圖中顯示錯誤消息。有任何想法嗎? –

+0

我意識到我沒有在視圖中顯示{{formset.non_form_errors}}。謝謝你的幫助。 –

1

您真的想要formset嗎?我懷疑,如果你有一個接觸,只有一個Response的實例中,然後形成你想要一個ModelForm ...

class ResponseForm(forms.ModelForm): 
    class Meta: 
     model = Response 
     fields=('name','email','phone', 
       'apt_size','movein_at', 
       'community','referred_by', 
       'comments') 

至於哪些字段允許爲空的,哪些不是,請確保它在管理員的第一個正確的事情,然後ModelForm將做正確的事情(這是管理員如何形式的表格畢竟)。