簡體   English   中英

始終會觸發對Django中CreateView和UpdateView的驗證,即使模型未/不應

[英]Validation on CreateView and UpdateView in django always being triggered, even when model doesn't/shouldn't

我不確定為什么在Forms.py的GroupForm表單中添加小部件會導致驗證失敗。 在此之前,他們尊重我的模型,現在為所有內容添加了小部件屬性之后,它不再尊重模型,並說所有內容都需要一個字段。 定義窗口小部件時,我是否還錯過了其他項目?

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

這並不是因為您添加了小部件,而是因為您實際上重新定義了字段,並且在重新定義它們時,您沒有遵守模型的要求。 例如在您的模型中

 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文檔的更多信息: 覆蓋默認值字段

暫無
暫無

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

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