5

私は現在django1.5とそのカスタムUSerモデルをテストしていますが、アカウントアプリでUserクラスを作成したことで、次のような問題を理解しています。

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'

account_userテーブルに保存されているユーザーを正しく登録できます。さて、どうすればログインできますか?私はで試しました

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

しかし、ユーザーはNoneであり、ログインフォームをレンダリングします:(なぜ私の認証者は私にNoneを返しますか?何か考えはありますか?

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
4

1 に答える 1

9

Django のドキュメントには、新しいカスタム ユーザーを使用した非常に良い例があります。

あなたのコードから欠けているのは、カスタム認証バックエンドだけです。

auth.py という名前のファイルがあります。メソッド「authenticate」と「get_user」が必要です。

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

次に、設定ファイルで認証バックエンドを指定する必要があります

AUTHENTICATION_BACKENDS = ('apps.accounts.auth.CustomAuth')
于 2012-12-15T17:38:42.477 に答える