11

現在、管理サイトにログインするときにDjango 1.4で使用されるデフォルトのフォームを上書きしようとしています(私のサイトでは、2要素認証にオプトインするユーザーに必要な追加の「トークン」フィールドを使用し、サイトスタッフには必須です)。Djangoのデフォルトのフォームは、私が必要とするものをサポートしていません。現在、templates/ディレクトリに、というファイルがありますtemplates/admin/login.html。これは、サイトの他の部分で使用しているテンプレートで使用されているテンプレートを正しく上書きしているようです。ファイルの内容は以下のとおりです。

# admin/login.html:
{% extends "login.html" %}

実際のログインフォームは以下のとおりです。

# login.html:
{% load url from future %}<!DOCTYPE html>
<html>
    <head>
        <title>Please log in</title>
    </head>
    <body>
        <div id="loginform">
            <form method="post" action="{% url 'id.views.auth' %}">
                {% csrf_token %}
                <input type="hidden" name="next" value="{{ next }}" />
                {{ form.username.label_tag }}<br/>
                {{ form.username }}<br/>
                {{ form.password.label_tag }}<br/>
                {{ form.password }}<br/>
                {{ form.token.label_tag }}<br/>
                {{ form.token }}<br/>
                <input type="submit" value="Log In" />
           </form>
        </div>
    </body>
</html>

私の問題は、AuthenticationForm表示するフォームとして自分のフォームを提供しているため、通常のログインURLを使用してアクセスすると、提供されたフォームが完全に機能することですが、Django Adminログインルートを介して、Djangoは独自のフォームをこのテンプレートに提供することを好みます。usernamepasswordフィールドがレンダリングされます。これを機能させる方法はありますか、それともHTMLフィールドをフォームに「ハードコーディング」したほうがよいのでしょうか。

4

6 に答える 6

18

Holá
私は非常に簡単な解決策を見つけました。
プロジェクトのurls.pyファイルを変更する必要があります(アプリケーションのものではなく、注意してください)

  1. PROJECTフォルダーで、ファイルurls.pyを見つけます。
  2. この行をインポートセクションに追加します
    from your_app_name import views
  3. この行を見つけます
    url(r'^admin/', include(admin.site.urls))
  4. その行の上に次を追加します
    url(r'^admin/login/', views.your_login_view),

これは例です

from django.conf.urls import include, url
from django.contrib import admin

from your_app import views

urlpatterns = [
    url(r'^your_app_start/', include('your_app.urls',namespace="your_app_name")),

    url(r'^admin/login/', views.your_app_login),
    url(r'^admin/', include(admin.site.urls)),
]
于 2015-09-12T13:38:05.467 に答える
12

AdminSitelogin_form使用されるフォームをオーバーライドするために使用できる属性があります。

サブクラス化してから、モデルをadminやurls.pyなどに登録するAdminSite代わりに、サブクラスのインスタンスを使用します。django.contrib.admin.site

それはすべてドキュメントにあります。

于 2012-07-05T15:13:23.383 に答える
9

このコードはurls.py私にとっては問題なく動作します(Djangoバージョン1.5.1):

from django.contrib import admin
from my.forms import AuthenticationForm

admin.autodiscover()
admin.site.login_form = AuthenticationForm
于 2013-08-11T13:00:26.620 に答える
1

これが古いスレッドであることは知っていますが、他の人に役立つ場合に備えて、見つけやすいものを追加したいと思いました。

特別なリモート認証(Shibboleth)を使用していますが、adminlogin_formをオーバーライドするだけでは不十分です。Cookieを設定して変数を返し、リモート認証プロバイダーなどにリダイレクトするビューがあります。

だから私がそれをした方法は:

from my_app.views import user_login, user_logout
admin.autodiscover()
admin.site.login = user_login
admin.site.logout = user_logout

よく働く!@dgkに感謝します

于 2015-03-10T13:26:47.903 に答える
0

たぶん、テンプレートタグを使用してカスタムを取得しますAuthenticationFormか?

于 2012-07-05T11:58:59.000 に答える
0

一意のログインURLにリダイレクトします(django2.1とpython3.6のf文字列を使用しています):

from apps import admin
from django.urls import path, include
from django.shortcuts import redirect

urlpatterns = [
    path(
        'admin/login/',
        lambda r: redirect(
            f"/login?{r.META['QUERY_STRING']}" if r.META['QUERY_STRING'] \
            else '/login'
        )
    ),
    path('admin/', admin.site.urls),
]
于 2020-06-16T07:37:32.117 に答える