【问题标题】:Django Built In AuthenticationForm Not Validating UserDjango内置AuthenticationForm不验证用户
【发布时间】:2019-06-05 22:25:37
【问题描述】:

我正在尝试使用 Django 框架构建登录系统。我扩展了 UserCreationForm 以添加姓名和电子邮件。现在我在数据库中有用户,我正在尝试对他们进行身份验证并登录。但是,当我调用内置的 AuthenticationForm 类时,使用发布数据创建一个实例并尝试对用户进行身份验证,我没有用户返回,认证失败。 views.py 文件的所有代码如下。我曾尝试阅读 AuthenticationForm 源代码,但这些都没有帮助。有什么建议吗?

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.db import models
from django import forms
from django.forms import EmailField
from django.forms import CharField
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User


class SignUpForm(UserCreationForm):
    email = EmailField(label=_("Email address"), required=True, help_text=_("Required."))

    class Meta:
        model = User
        fields = ('email', 'username', 'first_name', 'last_name',)

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        user.firstName = self.cleaned_data["first_name"]
        user.lastName = self.cleaned_data["last_name"]
        user.set_password(self.cleaned_data["password1"])

        if commit:
            user.save()
            return user




def signup(request):
    if request.method == 'POST': # if sending data to the server
        form = SignUpForm(request.POST)# creates form from request data
        if form.is_valid():
            user = form.save() # at this point, need to set user permissions, attach to user themselves? Add permissions this way?
            #            user.groups.set('tutors')
            user.save()

#            print(user.get_all_permissions()) # gets all permissions of user
#            print(user.groups.values_list('name',flat=True))
            # set permissions here
            # once set permissions, can close off the rest of the site and continue
            return redirect('/user/signup')
        else: # if form isn't valid
            errorMessage = True # sets flag to display error in HTML page
            form = SignUpForm()
            dict = {'errorMessage': errorMessage, 'form': form}
            return render(request, 'user/signup.html', dict) #
# pass in
    else: # if get request, return new form
        form = SignUpForm()
        return render(request, 'user/signup.html', {'form': form}) # return rendered form




#
#
#
def log_in(request):
    if request.method == 'POST':
        # need to get user from log in form

        form = AuthenticationForm(request.POST) # form isn't valid because user name isn't being passed in?
        print(form)
        user = form.get_user()
        print(user)
        # authentication form expects user name and password, needs to accept email
        if form.is_valid(): # WHY ISN'T THIS VALID
            # where to get user?
            user = form.get_user
            print("Groups: ")
            print(user.groups)

            return render(request, 'user/log_in.html', {'form': form}) #

        else:
            print("Not valid")
            return render(request, 'user/log_in.html', {'form': form}) #

````

【问题讨论】:

  • 更新:这是我的 settings.py 文件中的身份验证后端设置:AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', ]

标签: django forms authentication forms-authentication


【解决方案1】:

对于未来的参考: 需要使用AuthenticationForm这个参数:

form = AuthenticationForm(data=request.POST)

这将让它正确验证。

【讨论】:

  • 对。好奇你在哪里找到这些信息的?我在这个page 中找不到关于data 的任何信息
  • 同意,该参数没有确切的文档,但该文档确实将参数作为数据传入,请在文档上查看:from django.contrib.auth import update_session_auth_hash def password_change(request):如果 request.method == 'POST': form = PasswordChangeForm(user=request.user, data=request.POST) if form.is_valid(): form.save() update_session_auth_hash(request, form.user) else: .. .
  • 继续并在您发布的链接上搜索它,您会找到它。我的想法可能是它是一个超类参数,他们没有为表单子类讨论。
  • 是的,看到了...之间的超级发现。
【解决方案2】:

我认为问题太老了,但仍然。

身份验证表单(/site-packages/django/contrib/auth/forms.py) 是forms.Form (/site-packages/django/forms/forms.py) 的子类。

检查 forms.Form 类

def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
             initial=None, error_class=ErrorList, label_suffix=None,
             empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None):
    self.is_bound = data is not None or files is not None

除非is_bound 未设置为True,否则is_valid 将返回False。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2012-01-15
    • 2021-09-01
    相关资源
    最近更新 更多