Python Django表单字段实例变量

Python Django表单字段实例变量,python,django,custom-fields,Python,Django,Custom Fields,为了创建一个简单的类似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,

为了创建一个简单的类似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的第一个值进行的,而不是针对新随机生成的值。 我不明白字段对象是如何创建的,为什么我不能访问字段的值


提前感谢

请思考一下在您看来这是如何工作的。渲染表单时,将实例化该字段并将标签设置为随机值,这很好。现在,用户返回视图:发生了什么?表单被再次实例化,字段也是如此,字段被设置为两个新的随机值。毫不奇怪,这与前面的值不匹配,因为您没有将其存储在任何位置


要执行类似的操作,您需要将状态存储在某个位置,以便在请求之间保留状态。您可以尝试将其放在会话中:或者,更好的方法可能是将两个值散列在一起,并将它们放在一个隐藏字段中,然后在提交时对提交的值进行散列,并将其与隐藏字段中的值进行比较。这可能需要在表单级别而不是字段级别进行管理。

仅供参考,Google reCAPTCHA与django配合良好。