如何使用ChoiceField为Model FloatField属性Django自定义ModelForm

时间:2015-09-09 11:56:58

标签: python django

我有一个名为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的第一个项目,我想了解它的所有潜力。

1 个答案:

答案 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