簡體   English   中英

Django is_valid()無法與modelformset_factory一起使用

[英]Django is_valid() not working with modelformset_factory

我使用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

您的問題是,提供0個項目是有效的表單集,沒有最低驗證要求。 我將提供一個自定義BaseModelFormset子類,該子類的clean()方法僅檢查了至少一個obj。

您是否真的想要一個formset 我懷疑如果您只有一個Response實例的聯系人表單,那么您需要ModelForm ...

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

至於允許哪些字段為空白,哪些字段不允許為空白,請確保首先在管理員中執行正確的操作,然后ModelForm將執行完全正確的操作(這畢竟是管理員創建表格的方式)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM