如何为Model FloatField属性定制一个带有ChoiceField的ModelForm



我有一个名为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)

最新更新