始终触发django中CreateView和UpdateView的验证,即使模型没有/不应该被触发

时间:2016-07-27 19:52:38

标签: python django validation django-models django-forms

我不确定为什么在forms.py中的GroupForm表单中添加小部件会导致我的验证失败。在此之前,他们尊重我的模型,现在在为所有东西添加widget attrs之后,它不再尊重模型并且说一切都需要一个字段。在定义小部件时是否还有其他一些项目?

forms.py:

class GroupForm(forms.ModelForm):
    group_name = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'1', 'placeholder':'Groups name'}))
    group_contact = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'2', 'placeholder':'Groups point of contact person'}))
    tin = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'3', 'placeholder':'Groups tin#'}))
    npi = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'4', 'placeholder':'Groups npi#'}))
    notes = forms.CharField(widget = forms.Textarea(attrs={'tabindex':'5', 'placeholder':'Group notes'}))
    #notes = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'5', 'placeholder':'Groups notes'}))

    billing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'6'}))
    mailing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'7'}))
    start_date = forms.DateField(widget=forms.TextInput(attrs=
                                {
                                    'class':'datepicker',
                                    'tabindex' : '8',
                                    'placeholder' : 'Groups start date'
                                }))
    end_date = forms.DateField(widget=forms.TextInput(attrs=
                                {
                                    'class':'datepicker',
                                    'tabindex' : '9',
                                    'placeholder' : 'Groups term date'
                                }))
    change_date = forms.DateField(widget=forms.TextInput(attrs=
                                {
                                    'class':'datepicker',
                                    'tabindex' : '10',
                                    'placeholder' : 'Groups changed date'
                                }))

    change_text = forms.CharField(widget = forms.TextInput(attrs={'tabindex':'11', 'placeholder':'Reason for date change'}))
    #term_comment = forms.CharField(widget= forms.TextInput(attrs={'tabindex':'12', 'placeholder':'Note on group term'}))
    term_comment = forms.CharField(widget = forms.Textarea(attrs={'tabindex':'12',  'placeholder':'Note on group term'}))
    group_phone = forms.RegexField(regex=r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$', 
                                error_message = ("Phone number must be entered in the format: '555-555-5555 or 5555555555'. Up to 15 digits allowed."),
                                widget = forms.TextInput(attrs={'tabindex':'13', 'placeholder': '555-555-5555 or 5555555555'}))

    group_fax = forms.RegexField(regex=r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$', 
                                error_message = ("Fax number must be entered in the format: '555-555-5555 or 5555555555'. Up to 15 digits allowed."),
                                widget = forms.TextInput(attrs={'tabindex':'15', 'placeholder': '555-555-5555 or 5555555555'}))

    group_term = forms.ModelChoiceField(queryset=GroupTerm.objects.all(), widget=forms.Select(attrs={'tabindex':'16'}))

    class Meta:
        model=Group
        exclude = ['created_at', 'updated_at']

views.py:

class GroupCreateView(CreateView):
    model = Group
    form_class = GroupForm
    template_name = 'ipaswdb/group/group_form.html'
    success_url = 'ipaswdb/group/'

    def form_valid(self, form):
        return super(GroupCreateView, self).form_valid(form)

class GroupUpdateView(UpdateView):
    model = Group
    form_class = GroupForm
    template_name = 'ipaswdb/group/group_form.html'
    success_url = 'ipaswdb/group/'

小组模特:

class Group(models.Model):
    group_name = models.CharField(max_length=50)
    group_contact= models.CharField(max_length=50)
    tin = models.CharField(max_length=50)
    npi =models.CharField(max_length=50)
    notes = models.TextField(max_length = 255,  null=True, blank=True)
    billing_address = models.ForeignKey('Address', related_name = 'billing_address', on_delete=models.SET_NULL, null=True)
    mailing_address = models.ForeignKey('Address', related_name = 'mailing_address', on_delete=models.SET_NULL,  null=True, blank=True)
    start_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
    end_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
    change_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
    change_text = models.TextField(max_length = 255,  null=True, blank=True)
    term_comment = models.TextField(max_length = 255,  null=True, blank=True)
    group_phone=models.CharField(max_length=50)
    group_fax = models.CharField(max_length=50)
    group_term = models.ForeignKey(GroupTerm, on_delete=models.SET_NULL, null=True, blank=True) #quesiton is can a group be termed many times?
    created_at=models.DateField(auto_now_add=True)
    updated_at=models.DateField(auto_now=True)

    #provider_location = models.ManyToManyField('ProviderLocations', through='GroupLocations')

    def __str__(self):
        return self.group_name

1 个答案:

答案 0 :(得分:1)

这不是因为你添加了小部件,而是因为你实际上重新定义了这些字段,并且在重新定义它们时,你并不尊重你的模型的要求。例如,在你的模型中

 mailing_address = models.ForeignKey(..., null=True, blank=True)

邮寄地址可以为空,但在您定义的表格字段中,这是必需的。

mailing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'7'}))
# You need required=False

如果您想为modelForm重新定义自己的字段,那么您需要在执行此操作时尊重您的模型。 ,您还可以使用modelForm中现有的词典来完成您的尝试。例如,在class Meta内,你可以覆盖这样的小部件:

 class YourForm(ModelForm):
     class Meta:
        model = YourModel
        fields = ('field_1', 'field_2', 'field_3', ...)
        widgets = {
            # CHANGE THE WIDGETS HERE IF YOU WANT TO
            'field_1': Textarea(attrs={'cols': 80, 'rows': 20}),
        }  
        labels ={
            # CHANGE THE LABELS HERE IF YOU WANT TO
        }

更多信息,请访问Django的modelForm文档:Overriding defaults field