通过清理方法时,django modelform字段的验证错误不正确

2 投票
2 回答
693 浏览
提问于 2025-04-17 01:24

在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 的值。

撰写回答