2009-11-24 2 views
1

Я создал простую форму контакта с помощью modelformset_factory для создания формы в представлении с использованием модели БД. Проблема, с которой я столкнулась, заключается в том, что проверка is_valid() перед сохранением() не работает. Когда я отправляю форму с пустыми полями, она все еще пропускает 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 элементов является допустимым набором форм, минимальная валидация отсутствует. Я бы предоставил настраиваемый подкласс 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 будет делать именно то, что делает администратор.

Смежные вопросы