【问题标题】:Django is_valid() not working with modelformset_factoryDjango is_valid() 不适用于 modelformset_factory
【发布时间】:2009-11-24 18:18:38
【问题描述】:

我使用 modelformset_factory 创建了一个简单的联系表单,以使用 DB 模型在视图中构建表单。我遇到的问题是 save() 之前的 is_valid() 检查不起作用。当我提交带有空字段的表单时,它仍然通过 is_valid() 并尝试写入数据库。

我希望当字段为空时 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

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    您的问题是提供 0 个项目是有效的表单集,没有最低验证。我会提供一个自定义的 BaseModelFormset 子类,它的 clean() 方法只检查了至少一个 obj。

    【讨论】:

    • 您的解决方案有效,但我无法在视图中显示错误消息。有什么想法吗?
    • 我意识到我没有在视图中显示 {{ formset.non_form_errors }}。感谢您的帮助。
    【解决方案2】:

    您真的想要formset 吗?我怀疑如果您的联系人表单中只有一个 Response 实例,那么您需要 ModelForm...

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

    至于哪些字段可以留空,哪些不可以,首先确保它在管理员中做正确的事情,然后ModelForm 将做完全正确的事情(这就是管理员制作表单的方式毕竟)。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2019-04-01
      • 2018-06-09
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多