如何在django中注册后自动登录用户

Chr*_*ris 64 django

这就是我目前用于注册的内容:

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            messages.info(request, "Thanks for registering. Please login to continue.")
            return HttpResponseRedirect("/dashboard/")
    else:
        form = UserCreationForm()
    return render_to_response("accounts/register.html", {
        'form': form,
    }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

是否可以在创建帐户后不要求用户手动登录,而只是自动登录?谢谢.

编辑:我尝试过login()函数但没有成功.我认为问题是没有设置AUTHENTICATION_BACKENDS.

Ben*_*mes 97

使用authenticate()login()功能:

from django.contrib.auth import authenticate, login

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            messages.info(request, "Thanks for registering. You are now logged in.")
            new_user = authenticate(username=form.cleaned_data['username'],
                                    password=form.cleaned_data['password1'],
                                    )
            login(request, new_user)
            return HttpResponseRedirect("/dashboard/")
Run Code Online (Sandbox Code Playgroud)

  • 工作得很完美.最好是直接使用经过验证的表单字段而不是POST数据,因为它们在验证过程中由于某种原因而被修改.`new_user = authenticate(username = form.cleaned_data ['username'],password = form.cleaned_data ['password'])` (11认同)
  • 啊,你必须首先调用`authenticate()`否则没有`backend`设置.我已经更新了我的回答来说明这一点. (3认同)
  • 在`settings.py`中将`AUTHENTICATION_BACKENDS`设置为`django.contrib.auth.backends.ModelBackend`.有关详细信息,请参阅http://docs.djangoproject.com/en/1.2/topics/auth/#specifying-authentication-backends. (2认同)
  • 让我感到震惊的另一件事是你在`authenticate`ing时必须使用原始字符串.我试图变得聪明并将其从原始的`new_user`对象中偷偷摸摸,但我想它带有一些来自字段的引用.也就是说,不要这样做:`new_user = authenticate(username = new_user.username,password = new_user.password)`而不是从片段描述的`POST`或从`form`获取它们. (2认同)

col*_*s44 7

对于基于类的视图这里是为我工作的代码(最初是Django 1.7,更新为2.1)

from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.views.generic import FormView

class SignUp(FormView):
    template_name = 'signup.html'
    form_class = UserCreateForm
    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 HttpResponseRedirect(self.get_success_url)
Run Code Online (Sandbox Code Playgroud)