2010-07-11 44 views
57

Đây là những gì tôi hiện đang sử dụng cho đăng ký:Làm thế nào để tự động đăng nhập người dùng sau khi đăng ký trong 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)) 

Có thể không yêu cầu người dùng đăng nhập bằng tay sau khi tạo một tài khoản, nhưng thay vì chỉ đơn giản là để đăng nhập chúng tự động? Cảm ơn.

chỉnh sửa: Tôi đã thử hàm login() mà không thành công. Tôi tin rằng vấn đề là AUTHENTICATION_BACKENDS chưa được đặt.

+0

Tôi nghĩ rằng bạn có thể sử dụng này: http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.login –

Trả lời

87

Sử dụng authenticate()login() chức năng:

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/") 
+1

Cảm ơn bạn. Tôi đã thử điều này mà không thành công, nhưng bây giờ tôi nhận ra vấn đề là tôi đã không chỉ định backend. Các dòng: new_user.backend = 'django.contrib.auth.backends.ModelBackend' thông tin đăng nhập (yêu cầu, new_user) thực hiện thủ thuật. (Hoặc phụ trợ nên được chỉ định ở nơi khác thay vì mỗi lần có đăng ký?) – Chris

+2

Đặt 'AUTHENTICATION_BACKENDS' thành' django.contrib.auth.backends.ModelBackend' trong 'settings.py'. Để biết thêm thông tin, hãy xem http://docs.djangoproject.com/en/1.2/topics/auth/#specifying-authentication-backends. –

+0

Ngay cả với tập hợp đó, tôi nhận được lỗi "Đối tượng người dùng" không có thuộc tính 'phụ trợ' " – Chris

5

cho quan điểm dựa trên lớp đây là đoạn code mà làm việc cho tôi (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 = 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 super(SignUp, self).form_valid(form) 
+0

Tại sao 'xác thực (username = username, password = password)' là cần thiết? tại sao không chỉ truyền đối tượng người dùng? – avi

+1

@avi Khi bạn đăng nhập người dùng theo cách thủ công, bạn phải xác thực thành công người dùng bằng chứng thực() trước khi bạn gọi đăng nhập(). authenticate() đặt thuộc tính trên User noting mà backend xác thực đã xác thực thành công người dùng đó (xem tài liệu hướng dẫn phụ trợ để biết chi tiết), và thông tin này là cần thiết sau này trong quá trình đăng nhập. Một lỗi sẽ được nâng lên nếu bạn cố gắng đăng nhập một đối tượng người dùng được lấy trực tiếp từ cơ sở dữ liệu. Nguồn: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.login – f1nn

Các vấn đề liên quan