我正在尝试向表单添加一些验证。
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
就像我说的那样,我设法修复了该错误,但不了解是什么修复了该错误。想知道是否有人可以阐明一些想法。
答案 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