it-swarm.com.de

Wie kann man grundlegende Django Admin-Vorlagen überschreiben und erweitern?

Wie überschreibe ich eine Admin-Vorlage (z. B. admin/index.html) und erweitere sie gleichzeitig (siehe https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs -er-an-Admin-Vorlage ersetzen )?

Erstens: Ich weiß, dass diese Frage bereits gestellt und beantwortet wurde (siehe Django: Überschreiben UND Erweitern einer App-Vorlage ), aber wie die Antwort besagt, ist sie nicht direkt anwendbar, wenn Sie den Template-Loader app_directories (welcher ist meistens).

Meine derzeitige Problemumgehung besteht darin, Kopien zu erstellen und von ihnen zu erweitern, anstatt sie direkt aus den Admin-Vorlagen zu erweitern. Das funktioniert großartig, aber es ist wirklich verwirrend und bringt zusätzliche Arbeit, wenn sich die Admin-Vorlagen ändern.

Es könnte an ein benutzerdefiniertes Erweiterungs-Tag für die Vorlagen denken, aber ich möchte das Rad nicht neu erfinden, wenn bereits eine Lösung vorhanden ist.

Nebenbemerkung: Weiß jemand, ob Django dieses Problem angehen wird?

97
Semmel

Update

Lesen Sie die Dokumente für Ihre Version von Django. z.B. 

https://docs.djangoproject.com/de/1.11/ref/contrib/admin/#admin-overriding-templateshttps://docs.djangoproject.com/de/ 2.0/ref/contrib/admin/# admin-overriding-templates

Ursprüngliche Antwort von 2011:

Ich hatte vor etwa eineinhalb Jahren die gleiche Ausgabe und ich fand ein Nice template loader auf djangosnippets.org , das dies einfach macht. Sie können damit eine Vorlage in einer bestimmten App erweitern, sodass Sie eigene admin/index.html erstellen können, mit denen die Vorlage admin/index.html aus der Administrator-App erweitert wird. So was:

{% extends "admin:admin/index.html" %}

{% block sidebar %}
    {{block.super}}
    <div>
        <h1>Extra links</h1>
        <a href="/admin/extra/">My extra link</a>
    </div>
{% endblock %}

Ich habe ein vollständiges Beispiel zur Verwendung dieses Vorlagenladers in einem Blog-Post auf meiner Website gegeben.

93
heyman

Da Django 1.8 die aktuelle Version ist, ist es nicht erforderlich, einen Symlink zu erstellen, den Admin/Templates in den Projektordner zu kopieren oder Middlewares zu installieren, wie in den obigen Antworten vorgeschlagen. Hier ist was zu tun ist:

  1. erstellen Sie die folgende Baumstruktur (empfohlen von offizielle Dokumentation )

    your_project
         |-- your_project/
         |-- myapp/
         |-- templates/
              |-- admin/
                  |-- myapp/
                      |-- change_form.html  <- do not misspell this
    

Note: Der Speicherort dieser Datei ist nicht wichtig. Sie können es in Ihre App einfügen und es funktioniert immer noch. Solange seine Position von Django entdeckt werden kann. Noch wichtiger ist, dass der Name der HTML-Datei mit dem von Django angegebenen ursprünglichen HTML-Dateinamen identisch sein muss.

  1. Fügen Sie diesen Vorlagenpfad zu Ihrem settings.py hinzu:

    TEMPLATES = [
        {
            'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')], # <- add this line
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'Django.template.context_processors.debug',
                    'Django.template.context_processors.request',
                    'Django.contrib.auth.context_processors.auth',
                    'Django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
  2. Identifizieren Sie den Namen und den Block, den Sie überschreiben möchten. Dies geschieht durch einen Blick in das Admin/Templates-Verzeichnis von Django. Ich verwende virtualenv, für mich ist der Pfad hier:

    ~/.virtualenvs/Edge/lib/python2.7/site-packages/Django/contrib/admin/templates/admin
    

In diesem Beispiel möchte ich das Formular zum Hinzufügen neuer Benutzer ändern. Die Schablonenantwort für diese Ansicht ist change_form.html. Öffnen Sie die change_form.html und suchen Sie den {% block%}, den Sie erweitern möchten.

  1. Schreiben Sie in your change_form.html Folgendes:

    {% extends "admin/change_form.html" %}
    {% block field_sets %}
         {# your modification here #}
    {% endblock %}
    
  2. Laden Sie Ihre Seite auf und Sie sollten die Änderungen sehen

61
Cheng

wenn Sie den admin/index.html überschreiben müssen, können Sie den Parameter index_template der AdminSite einstellen.

z.B.

# urls.py
...
from Django.contrib import admin

admin.site.index_template = 'admin/my_custom_index.html'
admin.autodiscover()

und platziere deine Vorlage in <appname>/templates/admin/my_custom_index.html

42
gingerlime

Mit Django 1.5 (zumindest) können Sie die Vorlage definieren, die Sie für eine bestimmte modeladmin verwenden möchten.

siehe https://docs.djangoproject.com/de/1.5/ref/contrib/admin/#custom-template-options

Sie können so etwas tun

class Myadmin(admin.ModelAdmin):
    change_form_template = 'change_form.htm'

Wobei change_form.html eine einfache HTML-Vorlage ist, die admin/change_form.html erweitert (oder nicht, wenn Sie es von Grund auf neu machen wollen)

11
maazza

Chengs's Antwort ist korrekt, allerdings kann laut den Admin-Dokumenten nicht jedes Admin-Template folgendermaßen überschrieben werden: https://docs.djangoproject.com/de/1.9/ref/contrib/admin/#overriding-admin -vorlagen

Vorlagen, die je App oder Modell überschrieben werden können

Möglicherweise wird nicht jede Vorlage in contrib/admin/templates/admin überschrieben pro App oder pro Modell. Folgendes kann:

app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html

Für die templates, die auf diese Weise nicht überschrieben werden können, können Sie Überschreiben Sie sie dennoch für Ihr gesamtes Projekt. Einfach place das neue Version in Ihrem Verzeichnis templates/admin. Dies ist besonders nützlich um benutzerdefinierte 404- und 500-Seiten zu erstellen

Ich musste die login.html des Administrators überschreiben und musste daher die überschriebene Vorlage in diese Ordnerstruktur einfügen: 

your_project
 |-- your_project/
 |-- myapp/
 |-- templates/
      |-- admin/
          |-- login.html  <- do not misspell this

(ohne den myapp-Unterordner im Admin) Ich habe nicht genug Widerlegung, um Cheng's Post zu kommentieren. Deshalb musste ich dies als neue Antwort schreiben. 

6
matyas

Am besten ist es, wenn Sie die Django-Admin-Vorlagen in Ihr Projekt einfügen. Ihre Vorlagen würden sich also in templates/admin befinden, während sich die Django-Vorlagenvorlagen in sager template/Django_admin befinden würden. Dann können Sie Folgendes tun:

templates/admin/change_form.html

{% extends 'Django_admin/change_form.html' %}

Your stuff here

Wenn Sie sich Sorgen machen, ob die Vorratsvorlagen auf dem neuesten Stand sind, können Sie sie mit svn externals oder ähnlichem hinzufügen.

5
Chris Pratt

Ich stimme mit Chris Pratt überein. Aber ich denke, es ist besser, den Symlink zum ursprünglichen Django-Ordner zu erstellen, in dem sich die Admin-Vorlagen befinden:

ln -s /usr/local/lib/python2.7/dist-packages/Django/contrib/admin/templates/admin/ templates/Django_admin

und wie Sie sehen, hängt es von der Python-Version und dem Ordner ab, in dem der Django installiert ist. In Zukunft oder auf einem Produktionsserver müssen Sie möglicherweise den Pfad ändern.

1
James May

für den App-Index fügen Sie diese Zeile in eine allgemeine py-Datei wie url.py ein

admin.site.index_template = 'admin/custom_index.html'

für App-Modul-Index: Fügen Sie diese Zeile zu admin.py hinzu

admin.AdminSite.app_index_template = "servers/servers-home.html"

für Änderungsliste: Fügen Sie diese Zeile zur Admin-Klasse hinzu:

change_list_template = "servers/servers_changelist.html"

für Formularvorlage für das App-Modul: Fügen Sie diese Zeile Ihrer Admin-Klasse hinzu

change_form_template = "servers/server_changeform.html"

usw. und finden Sie andere in den Modulklassen desselben Administrators 

Diese - Site hatte eine einfache Lösung, die mit meiner Django 1.7-Konfiguration funktionierte.

FIRST: Legen Sie einen Symlink mit dem Namen admin_src im Verzeichnis template/des Projekts zu Ihren installierten Django-Vorlagen an. Für mich auf Dreamhost mit einem virtualenv waren meine "Quell" Django Admin-Vorlagen in:

~/virtualenvs/mydomain/lib/python2.7/site-packages/Django/contrib/admin/templates/admin

SECOND: Erstellt ein admin -Verzeichnis in templates /

Das Template/Verzeichnis meines Projekts sah nun so aus:

/templates/
   admin
   admin_src -> [to Django source]
   base.html
   index.html
   sitemap.xml
   etc...

THIRD: Erstellen Sie in Ihrem neuen Template/admin/-Verzeichnis eine base.html -Datei mit folgendem Inhalt:

{% extends "admin_src/base.html" %}

{% block extrahead %}
<link rel='shortcut icon' href='{{ STATIC_URL }}img/favicon-admin.ico' />
{% endblock %}

FOURTH: Fügen Sie Ihren Admin-Ordner favicon-admin.ico in Ihren statischen Root-Ordner img ein.

Erledigt. Einfach.

0
mitchf

Sie können Django-overextends verwenden, um die zirkuläre Vorlagenvererbung für Django bereitzustellen.

Es stammt aus dem Mezzanine CMS, von wo Stephen es zu einer eigenständigen Django-Erweiterung extrahierte.

Weitere Informationen finden Sie in "Overriding vs. Extending Templates" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) in den Mezzanine-Dokumenten.

Weitere Informationen finden Sie im Stephens Blog "Circular Template Inheritance for Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-Django).

In Google Groups begann die Diskussion (https: /groups.google.com/forum/#! Topic/mezzanine-users/sUydcf_IZkQ) mit der Entwicklung dieser Funktion.

Hinweis:

Ich habe nicht den Ruf, mehr als 2 Links hinzuzufügen. Aber ich denke, die Links bieten interessante Hintergrundinformationen. Also habe ich nach "http (s):" einen Schrägstrich weggelassen. Vielleicht kann jemand mit einem besseren Ruf die Links reparieren und diese Notiz entfernen.

0
Henri Hulski

Ich konnte keine einzige Antwort oder einen Abschnitt in den offiziellen Django-Dokumenten finden, die all über die Informationen verfügten, die ich zum Überschreiben/Erweitern der Standardadministrationsvorlagen benötigte. Ich schreibe diese Antwort als vollständige Anleitung und hoffe, dass dies der Fall ist es wäre in der Zukunft für andere hilfreich.

Nehmen wir die Standardstruktur des Django-Projekts an:

mysite-container/         # project container directory
    manage.py
    mysite/               # project package
        __init__.py
        admin.py
        apps.py
        settings.py
        urls.py
        wsgi.py
    app1/
    app2/
    ...
    static/
    templates/

Folgendes müssen Sie tun:

  1. Erstellen Sie in mysite/admin.py eine Unterklasse von AdminSite:

    from Django.contrib.admin import AdminSite
    
    
    class CustomAdminSite(AdminSite):
        # set values for `site_header`, `site_title`, `index_title` etc.
        site_header = 'Custom Admin Site'
        ...
    
        # extend / override admin views, such as `index()`
        def index(self, request, extra_context=None):
            extra_context = extra_context or {}
    
            # do whatever you want to do and save the values in `extra_context`
            extra_context['world'] = 'Earth'
    
            return super(CustomAdminSite, self).index(request, extra_context)
    
    
    custom_admin_site = CustomAdminSite()
    

    Stellen Sie sicher, dass Sie custom_admin_site in den admin.py Ihrer Apps importieren und Ihre Modelle darauf registrieren, um sie auf Ihrer benutzerdefinierten Administrationssite anzuzeigen (wenn Sie möchten).

  2. Erstellen Sie in mysite/apps.py eine Unterklasse von AdminConfig und setzen Sie default_site auf admin.CustomAdminSite aus dem vorherigen Schritt:

    from Django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
    
  3. Ersetzen Sie in mysite/settings.pyDjango.admin.site in INSTALLED_APPS durch apps.CustomAdminConfig (Ihre benutzerdefinierte Admin-App-Konfiguration aus dem vorherigen Schritt).

    from Django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
    
  4. Ersetzen Sie in mysite/urls.pyadmin.site.urls von der Administrator-URL in custom_admin_site.urls.

    from .admin import custom_admin_site
    
    
    urlpatterns = [
        ...
        path('admin/', custom_admin_site.urls),
        # for Django 1.x versions: url(r'^admin/', include(custom_admin_site.urls)),
        ...
    ]
    
  5. Erstellen Sie die Vorlage, die Sie ändern möchten, in Ihrem templates-Verzeichnis, und behalten Sie dabei die Standardverzeichnisstruktur der Django-Admin-Vorlagen bei, die in docs angegeben ist. Wenn Sie beispielsweise admin/index.html geändert haben, erstellen Sie die Datei templates/admin/index.html.

    Alle vorhandenen Vorlagen können auf diese Weise geändert werden, und ihre Namen und Strukturen finden Sie in Djangos Quellcode .

  6. Jetzt können Sie die Vorlage entweder überschreiben, indem Sie sie von Grund auf neu schreiben oder sie erweitern und dann bestimmte Blöcke überschreiben/erweitern.

    Wenn Sie beispielsweise alles beibehalten möchten, jedoch den content-Block überschreiben möchten (der auf der Indexseite die Apps und deren Modelle aufführt, die Sie registriert haben), fügen Sie templates/admin/index.html Folgendes hinzu:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
    {% endblock %}
    

    Um den ursprünglichen Inhalt eines Blocks zu erhalten, fügen Sie {{ block.super }} dort hinzu, wo der ursprüngliche Inhalt angezeigt werden soll:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
      {{ block.super }}
    {% endblock %}
    

    Sie können auch benutzerdefinierte Stile und Skripts hinzufügen, indem Sie die Blöcke extrastyle und extrahead ändern.

0
Faheel Ahmad