2010-06-14 19 views
71

Ich folge dem Tutorial auf http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 in einer Windows 7-Umgebung. Meine Einstellungen Datei ist:Django Vorlage Pfad

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

ich die base_template aus der Vorlage admin/base_site.html innerhalb des Standard Django Admin-Template-Verzeichnisses im Quellcode von Django bekam selbst (django/contrib/admin/templates) in ein Verzeichnis admin von myapp Verzeichnis wie das Tutorial angewiesen.

Es scheint aus irgendeinem Grund nicht zu wirken. Irgendwelche Hinweise darauf, was das Problem sein könnte? Muss ich eine Sync-Datenbank erstellen?

Antwort

148

Ich weiß, dies ist nicht in der Django-Tutorial, und Schande über sie, aber es ist besser, relative Pfade für Ihre Pfadvariablen einzurichten. Sie können es wie so ein:

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 Ihre Django-Projekt und Ihren Weg Wurzeln automatisch aktualisiert bewegen. Dies ist nützlich, wenn Sie Ihren Produktionsserver einrichten.

Zweitens ist Ihr TEMPLATE_DIRS-Pfad etwas Verdächtiges. Es sollte auf den Stamm Ihres Vorlagenverzeichnisses zeigen. Außerdem sollte es auch in einem nachlaufenden / enden.

Ich werde nur raten, dass das Verzeichnis .../admin/ nicht Ihre Vorlage root ist. Wenn Sie immer noch absolute Pfade schreiben möchten, sollten Sie den Verweis auf das Admin-Vorlagenverzeichnis entfernen.

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

Mit diesem wird gesagt, sollten die Vorlage Lader standardmäßig rekursiv eingerichtet werden, um in Ihre App-Verzeichnisse durchqueren Template-Dateien zu suchen.

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 nicht über die Admin-Vorlagen kopieren müssen, es sei denn, Sie möchten etwas speziell überschreiben.

Sie müssen eine syncdb ausführen, wenn Sie sie noch nicht ausgeführt haben. Sie müssen Ihre Mediendateien auch statisch servern, wenn Sie django über runserver hosten.

+1

Dank viel zu entfernen "/ admin" am Ende der TEMPLATE_DIRS relativer Pfad es tat. – shaytac

+1

Dieser Vorschlag setzt das Vorlagenverzeichnis in den Projektordner. Ist es für eine bessere Organisation sinnvoller, sie stattdessen in den App-Ordner zu legen? –

+0

Prost für diese Antwort! –

5

Für Django 1.6.6:

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

Auch statische und Medien für 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 festlegen (settings.py):

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', 
      ], 
     }, 
    }, 
] 

Official docs.

+0

Der Template-Pfad muss ein Tupel sein: verwenden Sie diese TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),) – renderbox

5

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

Mein Fehler war, dass ich nur die 'Django-Verwaltung' string bearbeitet habe und dem Handbuch nicht genug Aufmerksamkeit geschenkt habe.

Das ist die Linie 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 ‚site_header oder Standard war: _ 'Aussage, die entfernt werden sollte. Also nach dem Entfernen der Aussage (wie im Beispiel im Handbuch funktioniert alles wie erwartet).

Beispiel Handbuch:

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

Django-Einstellungen Bei der Verwendung als installiert ist, dann warum nicht nur seine gebackenen-in, vordefinierte BASE_DIR und VORLAGEN? In dem pip Django (v1.8) installiert ist, erhalte 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', 
      ], 
     }, 
    }, 
]