form.is_valid是False,但form.error不是。

问题描述 投票:0回答:1

我想提交一个登录。这是我的登录视图。

def login(request):

    context = {}
    print("ok ok ok ok ok")
    user = request.user

    if user.is_authenticated:
        print("ok ici")
        return render(request, "login.html")

    form = LoginForm(request.POST or None)
    if request.POST:
        print("ok ici1")

        if form.is_valid():
            email = form.POST['email']
            password = form.POST['password']
            user = authenticate(request, email=email, password=password)
            print(email)
            if user:
                login(request, user)
                if user.user_type == '1':
                    return render(request, "administrateur.html")
                elif user.user_type == '2':
                    return render(request, "entrepreneur.html")


        elif form.errors:
            print("errors")
            print(form.errors)
            form = AuthenticationForm()

    context['login_form'] = form

    return render(request, "login.html", context)

和我的表单类的自定义用户在 form.py

class LoginForm(forms.ModelForm):

    class Meta:
        model=CustomUser
        fields ={'email','password'}

我的HTML是这样的

<form  method="POST" action="{% url 'businessplan:login' %}">
    {% csrf_token %}
    <h2> Vous ètes un Admin ?</h2>

    <div class="container" action >
      <input type="hidden"  name="user_type" value="1">
      <label for ="id_email"><b>Votre Email</b></label>
      <input id="id_email" type="text" placeholder="Entrer Votre Email" name="email" required>

      <label for ="id_password" ><b>Mot de Passe</b></label>
      <input id="id_password" type="password" placeholder="Entrer Votre Mot de passe" name="password" required>
      <button type="submit" >Login</button>
      <label>
         <input type="checkbox" checked="checked" name="remember"> souviens de moi
      </label>
    </div>

    <div class="container" style="background-color:#f1f1f1">
      <button type="button" class="cancelbtn">annuler</button>
      <span class="psw">oublier <a href="#">mot de passe?</a></span>
    </div>
  </form>

当我提交我的 form.is_valid 返回 "False",并且 form.errors 印花 (<ul class="errorlist"><li>email<ul class="errorlist"><li>User with this Email already exists.</li></ul></li></ul>)

你能告诉我问题出在哪里吗?

django
1个回答
1
投票

它验证了下面的唯一性约束 email,因此说它不能创造一个 CustomUser 与该用户名。

你可以做一个简单的 Form,或者直接使用 AuthenticationForm [Django-doc]. 例如,我们可以改变 的源码 AuthenticationForm [GitHub]:

class LoginForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    email = forms.EmailField(widget=forms.TextInput(attrs={'autofocus': True}))
    password = forms.CharField(
        label=_("Password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
    )

在视图中,我们就可以使用清洗后的表单数据。

from django.shortcuts import redirect

def login(request):
    if user.is_authenticated:
        return redirect('name-of-some-view')
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            user = authenticate(request, email=email, password=password)
            if user is not None:
                login(request, user)
                if user.user_type == '1':
                    return redirect('name-of-some-view')
                else:
                    return redirect('name-of-some-view')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'login_form': form})

注意:: 在POST请求成功的情况下,你应该进行一个 redirect [Django-doc] 落实 PostRedirectGet 模式[wiki]. 这就避免了当用户刷新浏览器时,你会发出同样的POST请求。

© www.soinside.com 2019 - 2024. All rights reserved.