2012-12-14 27 views
5

i anda Django 1.5 ve özel kullanıcı modeli test ediyorum, ama bazı anlayış sorunları var i arar hesabım app, bir kullanıcı sınıfı oluşturduk gibi:kimlik doğrulaması ile 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' 

i hesap_kullanıcı tablomda saklanan bir kullanıcıyı doğru şekilde kaydedebilirim. Şimdi, nasıl giriş yapabilirim? Ben

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}) 

ile denedim ancak kullanıcı Yok benim autheticate bana None döndürür Neden giriş formunu :( işlemek? bir fikrin?

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

dosya içinde

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 

Ardından kimlik doğrulama arka uçları belirtilmesi gerekiyor? –

+0

soru değil, bir render() sanırım bir oturum açıldı. – billyJoe

+0

Tamamen * soru *. Giriş yap, sonra ... hiçbir şey. Sadece giriş formunu tekrar oluşturduğu son satıra kadar düşersiniz. Başka bir şey yapmak isterseniz, başka bir şey yapmak için aslında bir kod girmeniz gerekir. –

cevap

9
olduğunu

Django documentation, yeni özel kullanıcıyı kullanmanın gerçekten iyi bir örneğine sahiptir:

Eksik gördüğüm tek şey, özel kimlik doğrulama arka ucudur.

auth.py adlı bir dosyam var. "Kimlik doğrulaması" ve "get_user" yöntemleri gereklidir. ayarlarınız size `yeni kullanıcı ile giriş()` diyoruz sonra ne bekliyoruz ne

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

içine girmek bu ne çok özledim, çok teşekkürler – billyJoe

+1

Eğer AbstractBaseUser kullanıyorsanız, bir özel oluşturmak için gerekli kimlik doğrulama b ackend? "Django.contrib.auth.authenticate" [[kod] 'da hala kullanabilir miyiz (https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L11)], 'settings.AUTH_USER_MODEL' değerine bağlı olduğu için? Bu versiyonun bundan farklı bir şey yaptığını görmüyorum. Yapar? –

+2

Muhtemelen ModelBackend: alt sınıfını CustomAuth (ModelBackend) alt sınıfını kullanmak istersiniz – AJJ

İlgili konular