我有一个名为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。因为两者是相同的数据类型。
我期望做一些事情,当我们有一个M2M关系,你有dropbox。我项目中的问题是,如果修改甚至删除了Tax的值,我已经生成的发票就会出现问题。
我可以做一些工作,使它在页面提交时工作,但我不想这样做。这是我使用Django的第一个项目,我想了解它所有的潜力。
您可能不需要ModelForm
,而需要正常的Form
,因为您从InvoiceForm
得到的是Tax
对象,它不适合您的Invoice
模型。
你可以做的是为Invoice
定义一个除tax
以外的所有字段的表单,然后为tax
字段使用form.ModelChoiceField
:
class InvoiceForm(Form):
# define all your fields, I put some dummy fields here
field1 = CharField()
field2 = TextField()
# etc
tax = ModelChoiceField(queryset=Tax.objects.all())
然后在views.py中,手动获取值并构建Invoice
:
form = InvoiceForm(request.POST)
if form.is_valid():
field1 = form.cleaned_data['field1']
field2 = form.cleaned_data['field2']
tax_obj = form.cleaned_data['tax']
# create your invoice here
new_invoice = Invoice.objects.create(field1=field1,
field2 = field2,
tax=tax_obj.value)