我以django格式覆盖了clean()方法,并修复了出现的错误。但我不明白该错误是如何修复的

时间:2018-11-29 01:33:21

标签: python django debugging override

我正在尝试向表单添加一些验证。

  • 验证1:移动的数量应大于0。
  • 验证2:来源和目的地必须不同
  • 验证3:moved_moved必须小于源位置的数量。

Buggy代码

var myObject = yield context.df.callActivity(...);

现在,在测试期间,如果我为源和目的地输入了相同的值(都从指向数据库中同一张表的各个下拉列表中选择了两者),则会出现KeyError。

现在,如果我按如下所示更改要执行的检查的顺序,则代码可以正常工作。

工作代码:

# NOTE: Overriding the default method
def clean(self):
    cleaned_data = super().clean()
    source = str(cleaned_data['source'])
    destination = str(cleaned_data['destination'])
    quantity_moved = cleaned_data['quantity_moved']
    item = cleaned_data['item']

    # Checking if the source and destination are same
    if destination == source:
        msg = 'エラー:移動先と移動元が同じです。'
        self.add_error('source', msg)
        self.add_error('destination', msg)

    # Checking if the quantity to move is more than the current stock at the source location
    max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock
    print(">" * 80, max_qty)

    if quantity_moved > max_qty:
        msg = "エラー:移動元に商品の数は足りません。現在, {0}に {1}の数は {2} です。".format(source, item, max_qty)
        self.add_error('quantity_moved', msg)
    return cleaned_data

就像我说的那样,我设法修复了该错误,但不了解是什么修复了该错误。想知道是否有人可以阐明一些想法。

1 个答案:

答案 0 :(得分:2)

来自Django文档:

  

请注意,add_error()会自动从cleaned_data中删除该字段。

因此,在您的第一个代码示例中,如果目标等于源,则在目标上以及您要调用 add_error 时从 cleaned_data 获取源,如下所示:

max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock

您收到密钥错误,因为 source 密钥已从 cleaned_data

中删除

在第二个示例中,您尝试在调用add_error之前获取源。您可以通过更改以下代码行来更可靠地解决此问题

max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock

对此:

max_qty = ActualStock.objects.filter(item=item, location=source)[0].current_stock