2013-10-03 5 views
0

Для того, чтобы сделать простой 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, а не для новых случайно генерируемых значений. Я не понимаю, как создается объект Field и почему я не могу получить доступ к значениям моего поля.

Заранее спасибо

+0

FYI Google reCAPTCHA хорошо работает с django. – jarmod

ответ

2

У думать о том, как это работает с вашей точки зрения. Когда вы визуализируете форму, поле создается и устанавливает метку в ваши случайные значения, что хорошо. Теперь пользователь возвращается к представлению: что происходит? Ну, форма создается снова, как и поле, и поле устанавливается на два новых случайных значения. Неудивительно, что это не будет соответствовать предыдущему значению, потому что вы не сохранили его нигде.

Чтобы сделать что-либо подобное, вам нужно сохранить состояние где-то, чтобы оно сохранялось между запросами. Вы могли бы попробовать поместить его в сеанс, возможно: или, лучший способ может состоять в том, чтобы свести два значения вместе и поместить их в скрытое поле, а затем отправить хеш переданное значение и сравнить его с таковым в скрытом поле. Это, вероятно, нужно будет управлять на уровне формы, а не на поле.

Смежные вопросы