Django-Vorlagenpfad

87

Ich folge dem Tutorial unter http://docs.djangoproject.com/de/dev/intro/tutorial02/#intro-tutorial02 in einer Windows 7-Umgebung. Meine Einstellungsdatei lautet:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

Ich habe das base_templateaus der Vorlage admin/base_site.htmlaus dem Standard-Django-Admin-Vorlagenverzeichnis im Quellcode von Django selbst (django / contrib / admin / templates) in ein Admin-Unterverzeichnis des myapp-Verzeichnisses erhalten, wie im Tutorial angegeben.

Es scheint aus irgendeinem Grund keine Auswirkungen zu haben. Irgendein Hinweis darauf, was das Problem sein könnte? Muss ich eine Synchronisierungsdatenbank erstellen?

Shaytac
quelle

Antworten:

181

Ich weiß, dass dies nicht im Django-Tutorial enthalten ist, und schade, aber es ist besser, relative Pfade für Ihre Pfadvariablen einzurichten. Sie können es so einrichten:

import os

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)

Auf diese Weise können Sie Ihr Django-Projekt verschieben und Ihre Pfadwurzeln werden automatisch aktualisiert. Dies ist nützlich, wenn Sie Ihren Produktionsserver einrichten.

Zweitens ist Ihr TEMPLATE_DIRS-Pfad verdächtig. Es sollte auf das Stammverzeichnis Ihres Vorlagenverzeichnisses verweisen. Es sollte auch in einem Trailing enden /.

Ich werde hier nur vermuten, dass das .../admin/Verzeichnis nicht Ihr Vorlagenstamm ist. Wenn Sie dennoch absolute Pfade schreiben möchten, sollten Sie den Verweis auf das Admin-Vorlagenverzeichnis entfernen.

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/'
)

Vor diesem Hintergrund sollten die Vorlagenlader standardmäßig so eingerichtet sein, dass sie rekursiv in Ihre App-Verzeichnisse wechseln, um Vorlagendateien zu finden.

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

Sie sollten die Admin-Vorlagen nicht kopieren müssen, es sei denn, Sie möchten speziell etwas überschreiben.

Sie müssen eine Syncdb ausführen, wenn Sie sie noch nicht ausgeführt haben. Sie müssen Ihre Mediendateien auch statisch serverisieren, wenn Sie Django über Runserver hosten.

digitaler Träumer
quelle
1
Vielen Dank, dass Sie "/ admin" am Ende des relativen Pfads TEMPLATE_DIRS entfernt haben.
Shaytac
1
Dieser Vorschlag legt das Vorlagenverzeichnis im Projektordner ab. Ist es für eine bessere Organisation sinnvoller, sie stattdessen in den Ordner einer App zu legen?
Sahas Katta
2
Dies hat mein Problem behoben. Vielen Dank. ABER die Standardeinstellungsdatei hatte einen Kommentar mit TEMPLATE_DIRS, der besagte: "Vergessen Sie nicht, absolute Pfade zu verwenden, keine relativen Pfade." Kennt jemand die Rechtfertigung für diesen Kommentar?
Bhekman
1
PROJECT_PATH ist der absolute Pfad des Projektordners. Diese Methode legt den absoluten Medienpfad zur Laufzeit dynamisch fest, sodass der Wert nicht fest codiert ist und sich automatisch mit dem Speicherort des Projekts ändern kann. Dies ist ein alter Beitrag, aber Sie können diesen verwenden, um den Speicherort eines Ordners oder einer Datei im Projekt zu definieren.
Digitaldreamer
2
Ich würde vorschlagen os.path.join, Pfade an das Basisverzeichnis anzuhängen.
Antonagestam
34

Wenn Sie die installierten Django-Einstellungen verwenden, warum nicht einfach die eingebauten, vordefinierten BASE_DIR und TEMPLATES verwenden? In der installierten Pip Django (v1.8) bekomme ich:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            BASE_DIR + '/templates/',
        ],
        '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',
            ],
        },
    },
]
NathanQ
quelle
1
Dieses «BASE_DIR + '/ templates /'» hat es geschafft. Und es sieht viel eleganter aus als ein separater Bereich.
Maxiller
1
Verwenden Sie diese os.path.join(BASE_DIR, 'templates')Option, damit der Pfad plattformunabhängig ist.
Abhyudai
9

Intelligente Lösung in Django 2.0.3 zum Speichern von Vorlagen im Projektverzeichnis ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

Fügen Sie in views.py einfach einen solchen Vorlagenpfad hinzu:

app_name/html_name
2RMalinowski
quelle
8

Für Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Auch statisch und Medien für den Debug- und Produktionsmodus:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

In urls.py müssen Sie hinzufügen:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

In Django 1.8 können Sie Vorlagenpfade, Backend und andere Parameter für Vorlagen in einem Wörterbuch ( settings.py ) festlegen :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            path.join(BASE_DIR, 'templates')
        ],
        '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',
            ],
        },
    },
]

Offizielle Dokumente.

Dunaevsky Maxim
quelle
Der Vorlagenpfad muss ein Tupel sein: Verwenden Sie dieses TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'Vorlagen'),)
renderbox
6

Ich hatte auch Probleme mit diesem Teil des Tutorials (verwendetes Tutorial für Version 1.7).

Mein Fehler war, dass ich nur die Zeichenfolge 'Django Administration' bearbeitet und dem Handbuch nicht genügend Aufmerksamkeit geschenkt habe.

Dies ist die Zeile von django / contrib / admin / templates / admin / base_site.html :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Aber nach einiger Zeit und Frustration wurde klar, dass es die Anweisung 'site_header oder default: _' gab, die entfernt werden sollte. Nach dem Entfernen der Anweisung (wie im Beispiel im Handbuch funktionierte alles wie erwartet).

Beispielhandbuch:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
jpoppe
quelle
2

Okay 😁 Nehmen wir an, Sie haben ein brandneues Projekt. Wenn ja, gehen Sie in die settings.pyDatei und suchen TEMPLATESSie, sobald Sie es gefunden haben. Fügen Sie einfach diese Zeile os.path.join(BASE_DIR, 'template')ein. 'DIRS'Am Ende sollten Sie Folgendes erhalten:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

Wenn Sie wissen möchten, wo sich Ihr BASE_DIR-Verzeichnis befindet, geben Sie die folgenden drei einfachen Befehle ein:

python3 manage.py shell

Sobald Sie in der Shell sind:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS: Wenn Sie Ihren Vorlagenordner mit einem anderen Namen benannt haben, würden Sie ihn auch hier ändern.


quelle
1

In Django 2.2 wird dies hier erklärt

https://docs.djangoproject.com/de/2.2/howto/overriding-templates/

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
Sprudel
quelle
0

Im Grunde BASE_DIRist Ihr Django-Projektverzeichnis, das gleiche Verzeichnis, in dem es sich manage.pybefindet.

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            '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',
                ],
            },
        },
    ]

Dave
quelle