我不确定为什么在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
答案 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