1

我有一个购物车,我不希望客户添加的产品数量超过我的库存。我添加到购物车的表单字段如下。

数量字段是这样的:

quantity = forms.IntegerField(widget=forms.TextInput(attrs={'size':'2', 'value':'1', 
                                                            'class':'quantity', 'maxlength':'5'}),
                              error_messages={'invalid':'Please enter a valid quantity.', 'max_value':'max value error'}, min_value=1)

由于我的表单模型无法访问我的数据库,因此我无法将变量用于 max_value 属性。

所以在我看来,我重写了这个,以便在有人提交表单后,我声明:

form.fields['quantity'] = forms.IntegerField(widget=forms.TextInput(attrs={'size':'2', 'value':'1', 
                                                            'class':'quantity', 'maxlength':'5'}),
                              error_messages={'invalid':'Please enter a valid quantity.', 'max_value':'Sorry. We dont have that many in stock.'}, min_value=1, max_value=quantity)

在哪里

最大值=数量

是我库存中的物品数量。之后我调用 form.is_valid()。这样做会给我想要的结果。我的问题是这样做是否可以,有没有更好的方法?

4

1 回答 1

1

这并没有什么问题,但更好的方法是修改字段的validators属性,而不是抛弃整个定义:

form.fields['quantity'].validators.append(validators.MaxValueValidator(quantity))

仅在字段上进行更改max_value不会做任何事情,因为该值仅在IntegerField'__init__方法期间检查。

你可以用表单的__init__方法而不是视图来做到这一点——我可能会倾向于这种方式,以确保我没有忘记将它设置在某个地方。

另一种非常好的方法是clean_quantity在表单上以自定义方法检查数据库:

def clean_quantity(self):
    available_quantity = # some database lookup
    if self.cleaned_data['quantity'] > available_quantity:
        raise forms.ValidationError('Only %d items are available' % available_quantity)
    return self.cleaned_data['quantity']

我个人认为添加验证器更简单,但部分取决于您计划在多少视图中使用该表单。

于 2013-07-03T21:11:02.513 回答