【问题标题】:Django form is not being valid, how to fix it?Django 表单无效,如何解决?
【发布时间】:2021-11-14 13:28:43
【问题描述】:

我是 Django 新手,我正在使用 Django 创建一个电子商务商店。我成功创建了完美运行的用户登录表单,但我被困在用户注册表单上。无效。

我的 forms.py:

from django import forms
from django.forms.widgets import PasswordInput

class UserLoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)


class UserRegistrationForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)

    def clean(self):
        cleaned_data = super().clean()
        data = self.cleaned_data
        password = cleaned_data.get('password')
        password2 = cleaned_data.get('password2')

        if password2 != password:
            raise forms.ValidationError("Passwords must match")

        return data

我的 register.html

<div>
    <form method="POST" action="">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" name="Register">
    </form>
</div>

我的 login.html

<div>
    <form method="POST" action="">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" name="Login">
    </form>
</div>

我的意见.py

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import UserLoginForm, UserRegistrationForm

# Create your views here.

def userRegistrationPage(request):
    form = UserRegistrationForm()

    context = {
            'form': form
        }

    if request.method == 'POST':
        form = UserRegistrationForm(request.POST or None)

        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            print(username, password)
            
        else:
            print("Form is not valid")

    return render(request, 'index/register.html', context)

def userLoginPage(request):
    form = UserLoginForm()

    context = {
            'form': form
        }

    if request.method == 'POST':
        form = UserLoginForm(request.POST or None)

        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            user = authenticate(request, username=username, password=password)
            print(user)
            if user is not None:
                login(request, user)
                # Redirect to a success page.
                return redirect("/")
            else:
                print("Error")

    return render(request, 'index/login.html', context)

我的 urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index-page"), # Home Page
    path('register', views.userRegistrationPage, name='register'), #User Registeration Page
    path('login', views.userLoginPage, name='login'), #User Login Page
]

每次访问localhost:8000/register 时,我都会从views.py 中的表单验证的if/else 条件中收到消息Form is not valid。我对UserLoginForm 做了类似的处理,效果很好。

我尝试解决并查看了 Django 文档,但我没有发现问题所在。有人可以帮我为什么表格无效吗?我做错了什么?非常感谢。

【问题讨论】:

  • 您填写表格然后在测试中提交吗?
  • 是的,我填写了表格并按下了Submit 按钮,但没有执行if form.is_valid() 条件下的语句
  • @YasamanShokri,如果我从forms.py 中删除clean(self) 方法,那么UserRegistrationForm 可以完美运行,if form.is_valid() 条件的主体也会执行。
  • 您的 clean() 函数似乎有问题。试试这个,看看它是否有效。 password=data.get('password) 和 password2=data.get('password2')
  • @YasamanShokri 我终于弄清楚clean() 方法和if form.is_valid() 条件都在工作,只是raise forms.ValidationError("Passwords must match") 没有以一种不会打印错误的方式工作提交不同的密码。当我使用不同的密码测试表单时,这就是我的表单无效的原因,因为它引发了错误。当我使用相同的密码对其进行测试时,它运行良好,但重点是我应该如何引发错误以便它在前端打印错误?

标签: python django django-forms


【解决方案1】:

使用clean方法验证表单后无需返回数据

class UserRegistrationForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm password',widget=forms.PasswordInput)

    def clean(self):
        cleaned_data = super().clean()
        data = self.cleaned_data
        password = cleaned_data.get('password')
        password2 = cleaned_data.get('password2')

        if password2 != password:
            raise forms.ValidationError("Passwords must match")

【讨论】:

    【解决方案2】:

    您需要在您的template 文件中使用looping 格式,通过循环一一渲染字段

    试试这个:

    注册.html

    <form method="POST" novalidate>
        {% csrf_token %}
        {% if form.non_field_errors %}
            {% for error in form.non_field_errors  %}
                <span>{{error}}</span>
            {% endfor %}
        {% endif %}
        {% for field in form  %}
            <div>
                {{field.label_tag}}{{field}}
                {% for error in field.errors  %}
                    <span>{{error}}</span>
                {% endfor %}
            </div>
            <br>
        {% endfor %} 
        <input type="submit" value='Register'>
    </form>
    

    您需要更改您在forms.py 中定义的clean 方法。

    变成这样,

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        password2 = cleaned_data.get("password2")
    
        if password != password2:
            raise forms.ValidationError('password must match')
    

    django-doc中已经说明了。

    Note: 有时是服务器的问题,所以请确保您使用Ctrl+f5 多次硬刷新页面。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2020-12-05
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多