Я создал простую форму контакта с помощью 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
Ваше решение сработало, но я не могу отображать сообщения об ошибках в представлении. Есть идеи? –
Я понял, что в представлении я не показывал {{formset.non_form_errors}}. Спасибо за вашу помощь. –