Django注册设置(无密码)

Django注册设置(无密码),django,authentication,registration,django-registration,Django,Authentication,Registration,Django Registration,我试图建立一个网站,人们只把他们的电子邮件地址,他们登录的cookies和所有。稍后,我会要求他们提供密码和姓名,但不会使用用户名。我正试图用django注册来实现这一点,但我遇到了一些错误,我有一些问题 首先要禁用用户名作为登录功能,我把strtime改为username——我一直在寻找每次都会改变的东西 但是,当我跳过当前不需要的身份验证时,会出现错误: 'RegistrationProfile' object has no attribute 'backend' 或者,我可以离开身份验证

我试图建立一个网站,人们只把他们的电子邮件地址,他们登录的cookies和所有。稍后,我会要求他们提供密码和姓名,但不会使用用户名。我正试图用django注册来实现这一点,但我遇到了一些错误,我有一些问题

首先要禁用用户名作为登录功能,我把strtime改为username——我一直在寻找每次都会改变的东西

但是,当我跳过当前不需要的身份验证时,会出现错误:

'RegistrationProfile' object has no attribute 'backend'
或者,我可以离开身份验证,但我不知道如何只使用电子邮件而不使用密码进行身份验证。此外,我不知道如何使下一行工作:

auth.login(request, ProfileUser)
如果有人能带我离开这里,那就太棒了。下面是一些代码:

我的班级:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p
我的看法是:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )
我将发布任何其他所需的剪贴信息

您得到的“RegistrationProfile”对象没有属性“backend”错误,因为用户尚未通过身份验证。要让某人登录,必须首先调用authenticate方法,这需要密码。那么,你可以做的是:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)
然后,要让某人登录,只需使用请求和用户模型调用_login_user函数。这将是profile.user在您的情况下,可能会这样做,而不是调用auth.login。如果没有密码或用户名,我不确定您将如何确定这是否是有效用户,但我将留给您。如果你还有麻烦,请告诉我

简要说明:

这里基本上发生的是Django需要对用户进行身份验证,以便通过登录函数登录。身份验证通常由authenticate函数完成,该函数需要用户名和密码,并检查提供的密码是否与数据库中的哈希版本匹配。如果有,它会向用户模型添加一个身份验证后端


因此,由于您没有密码和用户名,因此只需编写自己的方法,将身份验证后端添加到用户模型中。这就是我的“登录”用户函数所做的-如果用户已经通过身份验证,它只调用登录,否则,它首先将默认后端添加到用户模型中,而不会像身份验证那样检查正确的用户名和密码。

对于阅读此线程的其他人,在使用User.objects.create而不是User.objects.create\u User时,我收到了类似的错误消息。基本上,第一种方法是设置一个清晰的密码,而create_user对密码进行加密。清除密码将无法进行身份验证。检查您的数据库,如果您在clear中设置了密码,那么您可能需要改用create_user


作者的请求可以通过使用create_user而不是user.save设置默认用户和密码来修复。

您可以创建一个已知密码,将其放入settings.py,并像用户输入密码一样使用它。用此创建用户并用此验证用户。

嘿,你是我的代码仙女。经过一些调整,它实际上完成了任务。你能用一句话来解释吗?我只是不明白这里发生了什么。我还搜索了关于什么是“后端”的解释,但没有找到。我添加了一个简短的解释,希望能有所帮助。这些东西在Django有点像黑暗的艺术,但我很高兴我让你走得更远。太棒了。我可以问一下后端是什么以及它包含什么吗?@mgPepe:引用Django文档,身份验证后端是一个实现两种方法的类:get_useruser_id和authenticate**credentials-