如果在try块中自定义表单域验证器,则不会引发ValidationError

时间:2016-02-24 13:33:57

标签: python django django-forms

做了什么

我有一个表单,它接收给用户的代码,以便他可以验证他的电子邮件地址。要检查表单是否有效,我创建了自定义字段验证程序,请参阅raise ValidationError("...")

问题

try - 块中class SignUpVerificationForm(forms.Form): def is_valid_verification_code(code): #settings time_to_verify_in_minutes = 5 try: tmp = SignUpUser.objects.get(signup_verification=code) email = tmp.signup_email time = tmp.signup_time if time >= timezone.now() - datetime.timedelta(minutes=time_to_verify_in_minutes): try: check = User.objects.get(email=email) raise ValidationError("This verification code was already used.") except: return code else: raise ValidationError("This verification code has expired.") except: raise ValidationError("Invalid verification code.") verification_code = forms.CharField(max_length=50, label='', validators=[is_valid_verification_code] ) 总是会失败。这是正常行为还是我做错了什么?

forms.py

def is_valid_verification_code(code):
    #settings
    time_to_register_in_minutes = 5

    try:
        tmp = SignUpUser.objects.get(signup_verification=code)
        email = tmp.signup_email
        time = tmp.signup_time
        if time >= timezone.now() - datetime.timedelta(minutes=time_to_register_in_minutes):
            try:
                user_already_active = User.objects.get(email=email)
                user_already_active = 1
            except:
                return code
        else:
            try:
                user_already_active = User.objects.get(email=email)
                user_already_active = 1
            except:
                user_already_active = 0
    except:
        raise ValidationError("Invalid verification code.")

    if user_already_active:
        raise ValidationError("This verification code was already used.")
    if not user_already_active:
        raise ValidationError("This verification code has expired.")

使用丑陋的解决方案进行编辑

我最终得到了以下代码。我认为这不是正确的做法,但我现在不知道更好,而且它正在发挥作用

DECLARE @Table1 TABLE 
    (Article varchar(4), Name varchar(3), Code int, Attribute varchar(17), AttributeValue varchar(7))
;

INSERT INTO @Table1
    (Article, Name, Code, Attribute, AttributeValue)
VALUES
    ('s123', 'abc', 1, 'SportsCategory', 'Rakesh'),
    ('s123', 'abc', 1, 'Brand', 'Amar'),
    ('s123', 'abc', 1, 'ProductDivision', 'Ball'),
    ('s123', 'abc', 1, 'MarketingDivision', 'Boss'),
    ('s222', 'XYZ', 1, 'SportsCategory', 'Rakesh5'),
    ('s222', 'XYZ', 1, 'Brand', 'Red'),
    ('s222', 'XYZ', 1, 'ProductDivision', 'blue'),
    ('s222', 'XYZ', 1, 'SportsCategory', 'Rakesh8')
;

Select Article, Name, Code, [SportsCategory],[Brand],[ProductDivision],[MarketingDivision] from (
select Article, Name, Code, Attribute, AttributeValue from @Table1)T
PIVOT (MAX(AttributeValue) FOR Attribute IN ([SportsCategory],[Brand],[ProductDivision],[MarketingDivision]))P

1 个答案:

答案 0 :(得分:2)

您没有按照raise的方式使用它。现在编写代码的方式,每次成功调用:

check = User.objects.get(email=email)

您将100%的时间提出异常:

raise ValidationError("This verification code was already used.")

你应该将它放在你的除外块中。

try:
    check = User.objects.get(email=email)
except:
    raise ValidationError("This verification code was already used.")

但是,根据您调用名为get的方法的方式。您可能需要添加一些逻辑来查看您是否实际上甚至需要提高“已使用”的异常。类似的东西:

if get:
    ValidationError("This verification code was already used.")

How try/except works