[英]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.