2012-12-14 29 views
5

tôi hiện đang thử nghiệm django 1.5 và nó mô hình người dùng tùy chỉnh, nhưng tôi đã một số vấn đề hiểu biết tôi đã tạo ra một lớp người dùng trong ứng dụng tài khoản của tôi, trông giống như:Authenticate với Django 1,5

class User(AbstractBaseUser): 
    email = models.EmailField() 
    activation_key = models.CharField(max_length=255) 
    is_active = models.BooleanField(default=False) 
    is_admin = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 

tôi có thể đăng ký một cách cẩn thận người dùng, người được lưu trữ trong bảng account_user của tôi. Bây giờ, tôi có thể đăng nhập bằng cách nào? Tôi đã thử với

def login(request): 
    form = AuthenticationForm() 
    if request.method == 'POST': 
     form = AuthenticationForm(request.POST) 
     email = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=email, password=password) 
     if user is not None: 
      if user.is_active: 
       login(user) 
      else: 
       message = 'disabled account, check validation email' 
       return render(
         request, 
         'account-login-failed.html', 
         {'message': message} 
       ) 
    return render(request, 'account-login.html', {'form': form}) 

nhưng người dùng là Không những nó render biểu mẫu đăng nhập :( Tại sao autheticate tôi trả tôi Không? Bất kỳ ý tưởng?

forms.py

class RegisterForm(forms.ModelForm): 
    """ a form to create user""" 
    password = forms.CharField(
      label="Password", 
      widget=forms.PasswordInput() 
    ) 
    password_confirm = forms.CharField(
      label="Password Repeat", 
      widget=forms.PasswordInput() 
    ) 
    class Meta: 
     model = User 
     exclude = ('last_login', 'activation_key') 

    def clean_password_confirm(self): 
     password = self.cleaned_data.get("password") 
     password_confirm = self.cleaned_data.get("password_confirm") 
     if password and password_confirm and password != password_confirm: 
      raise forms.ValidationError("Password don't math") 
     return password_confirm 

    def clean_email(self): 
     if User.objects.filter(email__iexact=self.cleaned_data.get("email")): 
      raise forms.ValidationError("email already exists") 
     return self.cleaned_data['email'] 

    def save(self): 
     user = super(RegisterForm, self).save(commit=False) 
     user.password = self.cleaned_data['password'] 
     user.activation_key = generate_sha1(user.email) 
     user.save() 

     return user 
+0

bạn đang mong đợi gì xảy ra sau khi bạn gọi 'đăng nhập() 'với người dùng mới? –

+0

nó không phải là câu hỏi, một render() tôi đoán với một phiên mở ra. – billyJoe

+0

Nó hoàn toàn * là * câu hỏi. Bạn gọi đăng nhập, sau đó ... không có gì. Bạn chỉ cần thả xuống dòng cuối cùng, nơi nó làm cho biểu mẫu đăng nhập lại. Nếu bạn muốn làm một cái gì đó khác, bạn sẽ cần phải thực sự đặt một số mã vào để làm một cái gì đó khác. –

Trả lời

9

Django documentation có ví dụ thực sự tốt về việc sử dụng người dùng tùy chỉnh mới.

Từ mã của bạn điều duy nhất tôi thấy thiếu là phần phụ trợ xác thực tùy chỉnh.

Tôi có tệp có tên auth.py. Các phương thức "xác thực" và "get_user" là bắt buộc.

from models import User as CustomUser 

class CustomAuth(object): 

    def authenticate(self, username=None, password=None): 
     try: 
      user = CustomUser.objects.get(email=username) 
      if user.check_password(password): 
       return user 
     except CustomUser.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     try: 
      user = CustomUser.objects.get(pk=user_id) 
      if user.is_active: 
       return user 
      return None 
     except CustomUser.DoesNotExist: 
      return None 

Sau đó backends xác thực phải được quy định trong các thiết lập của bạn nộp

AUTHENTICATION_BACKENDS = ('apps.accounts.auth.CustomAuth') 
+0

tuyệt vời này là những gì tôi đã bỏ lỡ, cảm ơn rất nhiều – billyJoe

+1

Nếu bạn đang sử dụng AbstractBaseUser, nó là cần thiết để tạo ra một tùy chỉnh xác thực b ackend? Chúng ta không thể sử dụng nó tại 'django.contrib.auth.authenticate' [[code] (https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L11)], vì nó dựa trên 'settings.AUTH_USER_MODEL'? Tôi không thấy rằng phiên bản này có gì khác với phiên bản đó. Phải không? –

+2

Bạn có thể muốn phân lớp 'ModelBackend':' class CustomAuth (ModelBackend) ' – AJJ

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