我有一个django表单,我正在使用该表单处理订单和卡付款。我已将表单扩展为具有信用卡字段,因为这些字段与我的模型不对应,因为我没有将其保存在数据库中。
在我的 forms.py 中,我为表单字段指定了class属性,如下所示:
class OrderForm(forms.ModelForm):
class Meta:
model = Order
fields = ['first_name', 'last_name', 'email',
'address', 'zipcode', 'city', 'state']
widgets = {
'first_name': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'First Name'}),
'last_name': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'Last Name'}),
'email': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'E-Mail'}),
'address': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'Address'}),
'zipcode': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'Zipcode'}),
'city': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'City'}),
'state': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'State'}),
}
我知道将演示文稿和业务逻辑混为一谈是很困难的,但是我有一个严格的截止日期,而且我正在使用带有我不完全了解的高级CSS的付费模板,因此这是我发现的方法到目前为止工作。我将在稍后阶段对此进行修改,以通过模板标记添加该类。
但是,由于此方法有效,我想继续使用此方法。
我的问题是,我无法以相同的方式为我的扩展表单分配属性,如下所示:
class OrderPayForm(OrderForm):
card_num = forms.CharField(max_length=16)
exp_month = forms.CharField(max_length=2)
exp_year = forms.CharField(max_length=2)
cvc = forms.CharField(max_length=3)
class Meta(OrderForm.Meta):
fields = OrderForm.Meta.fields + ['card_num', 'exp_month', 'exp_year', 'cvc']
尝试在我的 forms.py 或我的 views.py 中添加属性,例如:
class OrderPayForm(OrderForm):
card_num = forms.CharField(max_length=16)
exp_month = forms.CharField(max_length=2)
exp_year = forms.CharField(max_length=2)
cvc = forms.CharField(max_length=3)
class Meta(OrderForm.Meta):
fields = OrderForm.Meta.fields + ['card_num', 'exp_month', 'exp_year', 'cvc']
widgets = {
'card_num': forms.TextInput(attrs={'class': 'sizefull s-text7 p-l-22 p-r-22', 'placeholder': 'Card Number'}),
}
这不会导致错误消息,但是会导致我所有的表单域都丢失在我的forms.py中分配给该类的属性。
我在做什么错了?
答案 0 :(得分:1)
当您在子类中定义窗口小部件时,您将覆盖父类中的窗口小部件定义,可以避免这种情况的发生是编写自定义初始化方法:
class OrderPayForm(OrderForm):
card_num = forms.CharField(max_length=16)
exp_month = forms.CharField(max_length=2)
exp_year = forms.CharField(max_length=2)
cvc = forms.CharField(max_length=3)
class Meta(OrderForm.Meta):
fields = OrderForm.Meta.fields + ['card_num', 'exp_month', 'exp_year', 'cvc']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['card_num'].widget = forms.TextInput(attrs={
'class': 'sizefull s-text7 p-l-22 p-r-22',
'placeholder': 'Card Number'
})