【问题标题】:(Django) Validation Forms in class based View doesn't work(Django)基于类的视图中的验证表单不起作用
【发布时间】:2021-05-12 12:42:49
【问题描述】:

我创建了一个视图,用户可以在其中注册使用带有验证功能的表单。 但是,这些功能不起作用。

class SignUpPage(View):
    def get(self, request):
        form = SignUpForm()
        return render(request, "signup.html", {'form': form})
    def post(self, request):
        form = SignUpForm(request.POST or None)
        if form.is_valid():
            redirect('/signup')
        else:
            form = SignUpForm()
        ctx = {"form": form}
        return render(request, "signup.html", ctx)

形式:

class SignUpForm(forms.Form):
    first_name = forms.CharField(max_length=32, required=True)
    last_name = forms.CharField(max_length=32, required=True)
    username = forms.CharField(max_length=32, required=True)
    email = forms.CharField(label="email")
    password1 = forms.CharField(label="Password", max_length=32, widget=forms.PasswordInput(attrs={'class': 'password'}))
    password2 = forms.CharField(label="Password Again", max_length=32, widget=forms.PasswordInput(attrs={'class': 'password'}))
    date_of_birth = forms.DateField(label="Date of birth", required=True, widget=forms.SelectDateWidget(years=YEARS, attrs={'class': 'date-select'}))

def validate_email(self):
    data = self.cleaned_data.get('email')
    if User.objects.filter(email=data).exists():
        raise forms.ValidationError("This email is already registered")
    return data

def validate_age(self):
    user_date = str(self.cleaned_data['date_of_birth'])
    year = int(user_date[0:4])
    month = int(user_date[5:7])
    day = int(user_date[8:10])
    today = dt.today()

    if int(today.year) - year < 18:
        raise forms.ValidationError("You must be 18 years old to have an account")
    elif int(today.year) - year == 18 and int(today.month) - month < 0:
        raise forms.ValidationError("You must be 18 years old to have an account")
    elif int(today.year) - year == 18 and int(today.month) - month == 0 and int(today.day) - day < 0:
        raise forms.ValidationError("You must be 18 years old to have an account")
    else:
        return user_date

谁能解释一下为什么这些验证功能不起作用? 我什至尝试过:

    def validate_email(self):
        data = self.cleaned_data.get('email')
        if data == "abc":
            raise forms.ValidationError("This email is already registered")
        return data

通过在输入字段中写入“abc”。

或:

data = self.cleaned_data['email']

更多细节的HTML代码:

   <form action="" method="post" class="formField">
                {% csrf_token %}
                {{form}}
                <div class="s-password">
                    <input type="checkbox" class="form-checkbox" id="show-password" onclick="showPassword()">
                    <label for id="s-password">Show Password</label>
                </div>
                <div class="form-btn-wrapper">
                    <button type="submit" class="btn-form">Sign Up</button>
                    <input type="checkbox" class="form-checkbox" id="check" name="remember">
                    <label for id="remember">Remember me</label>
                </div>
                <footer class="form-footer">
                    <p>Already have an account <a href="/login">Login now</a></p>
                </footer>
</form>

【问题讨论】:

    标签: python django


    【解决方案1】:
        else:
            form = SignUpForm()
    

    当表单无效时,您正在再次创建表单,但没有将任何发布数据传递给它。验证器可能工作正常,但您在重新创建表单时将其屏蔽。

    要解决这个问题,只需删除这两行,这里不需要它们,因为您的 GET 路径与您的视图中的 POST 路径是分开的。

    【讨论】:

    • 另外,request.POST or None 应该只是 request.POST
    • 谢谢,但在我的情况下它不起作用。删除这些行后,添加 print(form.is_valid) got True.
    • 您确定您的 HTML 表单使用 POST 提交数据吗?
    【解决方案2】:

    当表单无效时,您将表单分配给空表单

    def post(self, request):
        form = SignUpForm(request.POST or None)
        if form.is_valid():
            # User creation logic ...
            return redirect('/signup') # Your success url page after user is created
    
        # If this code is executed it means form was not valid
        ctx = {"form": form}
        return render(request, "signup.html", ctx) # Your sign up page to display validation error messages
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 2020-12-25
      • 2021-07-17
      • 2013-04-06
      • 2020-08-25
      • 2019-09-24
      • 1970-01-01
      • 2017-04-06
      相关资源
      最近更新 更多