用户注册后Django自动登录(1.4)
Posted
技术标签:
【中文标题】用户注册后Django自动登录(1.4)【英文标题】:Django automatic login after user registration (1.4) 【发布时间】:2013-02-18 00:35:29 【问题描述】:我在成功注册用户时遇到问题 - 但是,我希望用户在注册时登录。这是代表我的注册视图的代码。关于为什么用户没有自动登录的任何想法?
注意事项:
用户注册正确,之后可以登录 authenticate(**kwargs) 正在返回正确的用户在 settings.py 我有:
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
谢谢!
def register(request):
user_creation_form = UserCreationForm(request.POST or None)
if request.method == 'POST' and user_creation_form.is_valid():
u_name = user_creation_form.cleaned_data.get('username')
u_pass = user_creation_form.cleaned_data.get('password2')
user_creation_form.save()
print u_name # Prints correct username
print u_pass # Prints correct password
user = authenticate(username=u_name,
password=u_pass)
print 'User: ', user # Prints correct user
login(request, user) # Seems to do nothing
return HttpResponseRedirect('/book/') # User is not logged in on this page
c = RequestContext(request, 'form': user_creation_form)
return render_to_response('register.html', c)
【问题讨论】:
【参考方案1】:啊!我想到了。万一有人遇到这个问题,如果您手动调用它,请从 django.contrib.auth 导入登录名 - 我正在导入视图。注释掉的代码代表我的情况的错误导入。
# from django.contrib.auth.views import login
from django.contrib.auth import authenticate, logout, login
【讨论】:
【参考方案2】:我是这样做的:
u.backend = "django.contrib.auth.backends.ModelBackend"
login(request, u)
【讨论】:
【参考方案3】:对于基于类的视图,这里的代码对我有用 (django 1.7)
from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from django.views.generic import FormView
class SignUp(FormView):
template_name = 'signup.html'
form_class = UserCreationForm
success_url='/account'
def form_valid(self, form):
#save the new user first
form.save()
#get the username and password
username = self.request.POST['username']
password = self.request.POST['password1']
#authenticate user then login
user = authenticate(username=username, password=password)
login(self.request, user)
return super(SignUp, self).form_valid(form)
【讨论】:
我认为你的form_class
应该是 UserCreationForm
而不是 UserCreateForm
。
因为我需要一个解决方案,正如@Patrick 在此线程的评论中指出的那样:***.com/questions/3222549/…,最好使用authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
进行身份验证,以防某些内容因某种原因被修改在验证期间。
肯定通过使用django.views.generic.CreateView
而不是django.views.generic.FormView
可以节省自己的调用保存,并在顶部使用它?
这在 Django 2.1.4 中无法开箱即用,我不得不使用 redirect
使用不同的返回值,请参阅我的单独 [问题](***.com/questions/54179736/…)以上是关于用户注册后Django自动登录(1.4)的主要内容,如果未能解决你的问题,请参考以下文章
8Django实战第8天:session和cookie自动登录机制