通过clean方法传递时,django modelform字段上的验证错误错误

时间:2011-09-04 13:36:45

标签: python django django-forms validation

django项目中的Model和ModelForm定义如下:

class Consumption(models.Model):
    date=models.DateTimeField(default=datetime.now)
    product_name=models.ForeignKey(Stock,to_field='product_name')
    quantity=models.IntegerField()
    customer=models.CharField(max_length=50,null=True,blank=True)

    def __unicode__(self):
        return self.product_name

class ConsumptionForm(ModelForm):
    class Meta:
        model=Consumption

    def clean_quantity(self):
        cleaned_data=self.cleaned_data
        product=cleaned_data.get("product_name")
        quantity=int(cleaned_data.get('quantity'))
        stock=Stock.objects.get(product_name=product)
        if quantity > stock.quantity:
            raise forms.ValidationError("Not enough stock")
        return cleaned_data

其中Stock类包含作为消费外键的产品名称,其数量应大于消费数量。

现在问题是当我输入提交给ConsuForm时。它给出了数量字段的错误,因为即使在我提供整数之后,该字段也必须是整数。

这可能是什么原因?

2 个答案:

答案 0 :(得分:3)

您将从cleaned_data方法返回整个clean_quantity字典,而不仅仅是quantity的值。

答案 1 :(得分:2)

您不需要将cleaning_data.get('quantity')强制转换为int。 Django在表单基类上的to_python()方法将为您做到这一点。作为验证过程的一部分,所有表单都会尝试将其值转换为Python值。

我没有在clean_quantity()方法中看到任何会让我认为它不起作用的内容,虽然你没有展示你的Stock课程,所以我们可以看到什么类型的现场股票。数量是。

我的建议是为此表单和查看方法编写单元测试,以确保您获得正确的值。 https://docs.djangoproject.com/en/1.3/topics/testing/

如果你不习惯编写单元测试,现在是开始的好时机。他们真的可以节省你很多时间。