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