通过清理方法时,django modelform字段的验证错误不正确
在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类包含了产品名称,这个名称作为Consumption的外键,并且它的数量应该大于消费数量。
现在的问题是,当我提交ConsumptionForm时,数量字段出现错误,提示这个字段必须是一个整数,即使我输入的确实是整数。
这可能是什么原因呢?
2 个回答
2
你不需要把 cleaned_data.get('quantity') 转换成 int
类型。Django 的 to_python() 方法会自动帮你处理这个问题。在表单的验证过程中,所有表单都会尝试把它们的值转换成 Python 能理解的格式。
我在你的 clean_quantity() 方法里没有看到任何会让我觉得它会出问题的地方,不过你没有展示你的 Stock
类,所以我看不到 stock.quantity 是什么类型的字段。
我的建议是为这个表单和视图方法写一个单元测试,以确保你得到的是正确的值。你可以参考这个链接了解更多:https://docs.djangoproject.com/en/1.3/topics/testing/
如果你还没有养成写单元测试的习惯,现在正是一个很好的开始时机。单元测试可以帮你节省很多时间。
3
你从 clean_quantity
方法里返回的是整个 cleaned_data
字典,而不是仅仅返回 quantity
的值。