为了制作一个简单的类似captacha的字段,我尝试了以下方法:
class CaptchaField(IntegerField):
def __init__(self, *args, **kwargs):
super(CaptchaField, self).__init__(*args, **kwargs)
self.reset()
def reset(self):
self.int_1 = random.randint(1, 10)
self.int_2 = random.randint(1, 10)
self.label = '{0} + {1}'.format(self.int_1, self.int_2)
def clean(self, value):
value = super(CaptchaField, self).clean(value)
if value != self.int_1 + self.int_2:
self.reset()
raise ValidationError(_("Enter the result"), code='captcha_fail')
return True
每次我的答案是错误的,标签会按预期更改,但测试是针对int_1和int_2的第一个值执行的,而不是针对新随机生成的值。 我不明白字段对象是如何创建的,以及为什么我不能访问字段的值。在
提前谢谢
思考一下你认为这是如何运作的。当您呈现表单时,该字段被实例化并将标签设置为您的随机值,这很好。现在,用户发回视图:发生了什么?好吧,表单和字段一样被再次实例化,字段被设置为两个新的随机值。毫不奇怪,这将与前面的值不匹配,因为您没有将其存储在任何地方。在
要执行类似的操作,需要将状态存储在某个地方,以便在请求之间保留状态。您可以尝试将其放入会话中:或者,更好的方法是将两个值哈希在一起并将它们放入隐藏字段中,然后在提交哈希时将提交的值与隐藏字段中的值进行比较。这可能需要在表单级别而不是字段级别进行管理。在
相关问题 更多 >
编程相关推荐