我有一个名为Invoice的模型,其中包含以下属性(以及其他内容):
class Invoice(models.Model):
tax = models.FloatField()
一个名为Tax的模型:
class Tax(models.Model):
name = models.CharField(max_length=20)
value = models.FloatField()
creation_date = models.DateTimeField(auto_now_add=True)
description = models.CharField(max_length=50, blank=True)
def __unicode__(entry):
return str(entry.id) + " - " + entry.name + " (%.1f" % (entry.value) + "%)"
在我的ModelForm上我有:
class InvoiceForm(ModelForm):
class Meta:
model = Invoice
fields = '__all__'
widgets = {
'due_date': forms.TextInput(attrs={'class': 'form-control'}),
'due_date': DateTimePicker(options={"format": "DD/MM/YYYY","pickTime": False}),
'tax': forms.ChoiceField(choices=(Tax))
}
我想要的是为这个类生成一个ModelForm,用Tax类中的值替换ChoiceField的FloatField。提交表单时,我会得到税(tax.value)的值并设置为invoice.tax,因为两者都是相同的数据类型。
我期待做一些像我们有M2M关系的事情,你有Dropbox。我的项目中的问题是,如果税的价值被修改甚至删除,我的生成发票就会出现问题。
我可以做一些解决方法,并在页面提交时使其工作,但我不想这样做。这是我与Django的第一个项目,我想了解它的所有潜力。
答案 0 :(得分:1)
您可能不需要ModelForm
而是正常Form
,因为您从InvoiceForm
得到的是Tax
对象,它不适合您的Invoice
1}}模型。
您可以做的是为tax
的{{1}}除了Invoice
以外的每个字段定义一个表单,然后为您使用tax
的{{1}}字段定义:
form.ModelChoiceField
然后在views.py中,手动获取值并构建class InvoiceForm(Form):
# define all your fields, I put some dummy fields here
field1 = CharField()
field2 = TextField()
# etc
tax = ModelChoiceField(queryset=Tax.objects.all())
:
Invoice