8

アプリで組み込みログインを使用しています。これを処理するカスタム バックエンドまたはパッケージがいくつかあります。しかし、それらの多くは私が探しているものではありません。

登録時にdjango-registrationを介してメールを一意にしました。今私が欲しいのは、ユーザー名の代わりにログインページで電子メールを尋ねることだけです.

しかし、django 電子メールのようなカスタム バックエンドをユーザー名として使用すると、django-registration で使用するとクラッシュします。

すべての認証バックエンドを変更したくありません。ログイン ページを変更したいだけです。

サイトの残りの部分では、ユーザー名を使用します。私が書いたときの私のカスタム管理ページのpe:

welcome {{user}}

ユーザー名をレンダリングする必要があります。電子メールではありません。

私はこれから抜け出す方法を見つける必要があります。ハマった。

ありがとうございました。

4

2 に答える 2

10

デフォルトでdjango.contrib.auth.urlsは、このパターンからログイン ページが作成されます

(r'^login/$', 'django.contrib.auth.views.login'),

この URL を回避/オーバーライドしてから、新しいタイプのログインを処理する新しいビューを作成する必要があります。

例えば

urls.py に新しいログイン URL を作成します

(r'^emaillogin/$', 'email_login_view'),

views.py でメールによるログインをサポートするビューを作成する

# get default authenticate backend
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User

# create a function to resolve email to username
def get_user(email):
    try:
        return User.objects.get(email=email.lower())
    except User.DoesNotExist:
        return None

# create a view that authenticate user with email
def email_login_view(request):
    email = request.POST['email']
    password = request.POST['password']
    username = get_user(email)
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

参照: https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.login

于 2012-11-18T14:23:46.480 に答える
2

上記のアプローチは、django 1.9 では機能しなくなりました。別のアプローチとして、ビューで使用される認証フォームを次のようにオーバーライドすることもできます。

class EmailLoginForm(AuthenticationForm):
def clean(self):
    try:
        self.cleaned_data["username"] = get_user_model().objects.get(email=self.data["username"])
    except ObjectDoesNotExist:
        self.cleaned_data["username"] = "a_username_that_do_not_exists_anywhere_in_the_site"
    return super(EmailLoginForm, self).clean()

次に、ログイン URL を定義するときに、次のように定義します。

url(r'^login/$', django.contrib.auth.views.login, name="login", kwargs={"authentication_form": EmailLoginForm}),
url(r'^', include('django.contrib.auth.urls')),

上記のアプローチの最も良い点は、認証プロセスで実際には何も触れていないことです。これは実際には「クリーンな」ソリューションではありませんが、簡単な回避策です。auth.urls を含める前にログイン パスを定義すると、基本ログイン フォームの代わりに評価されます。

于 2016-03-30T12:31:26.390 に答える