web-dev-qa-db-de.com

Django-Vorlagenordner

Ich experimentiere mit Django und finde heraus, wie man urls.py setzt und wie die URLs funktionieren . Ich habe urls.py im Stammverzeichnis des Projekts konfiguriert, um zu meinem Blog und Admin zu verweisen .. .Aber jetzt möchte ich eine Seite zu meinem Haus hinzufügen, also bei localhost: 8000.

Ich habe also folgenden Code zu urls.py im Stammverzeichnis des Projekts hinzugefügt:

from Django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    (r"^$", direct_to_template, {"template": "base.html"}),
)

Das Problem ist, dass es nach der Vorlage in blog/templates /....__ sucht. Statt dem Vorlagenordner in meinem Stammverzeichnis. Welches enthält die base.html

volle urls.py:

from Django.conf.urls import patterns, include, url
from Django.views.generic.simple import direct_to_template

# Uncomment the next two lines to enable the admin:
from Django.contrib import admin
admin.autodiscover()


urlpatterns = patterns('',
    (r"^$", direct_to_template, {"template": "base.html"}),
    url(r'^blog/', include('hellodjango.blog.urls')),
    url(r'^admin/doc/', include('Django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
    (r'^tinymce/', include('tinymce.urls')),
)

BEARBEITEN: vollständige urls.py hinzugefügt :)

Übersehe ich etwas?

26
Kevinvhengst

Haben Sie TEMPLATE_DIRS in Ihrem settings.py eingestellt? Überprüfen Sie und stellen Sie sicher, dass es mit absoluten Pfaden richtig eingerichtet ist. So stelle ich sicher, dass es richtig eingestellt ist:

einstellungen.py

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

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/Django_templates" or "C:/www/Django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(PROJECT_ROOT, 'templates').replace('\\','/'),
)

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'Django.template.loaders.filesystem.Loader',
    'Django.template.loaders.app_directories.Loader',
#     'Django.template.loaders.eggs.Loader',
)

Auf diese Weise habe ich einen templates-Ordner in meinem Projektstammverzeichnis, der für Nicht-App-Vorlagen verwendet wird, und jede App hat einen templates/appname-Ordner in der App selbst. 

Wenn Sie eine Vorlage aus dem Stammvorlagenordner verwenden möchten, geben Sie einfach den Namen der Vorlage an, beispielsweise 'base.html'. Wenn Sie eine App-Vorlage verwenden möchten, verwenden Sie 'appname/base.html'.

Ordnerstruktur:

project/
  appname/
    templates/ 
      appname/  <-- another folder with app name so 'appname/base.html' is from here
        base.html
    views.py
    ...

  templates/    <-- root template folder so 'base.html' is from here
    base.html

  settings.py
  views.py
  ...
56
Ngenator
from Django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from Django.contrib import admin
admin.autodiscover()


urlpatterns = patterns('',
    url(r'^blog/', include('hellodjango.blog.urls')),
    url(r'^admin/doc/', include('Django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^tinymce/', include('tinymce.urls')),
)

urlpatterns += patterns(
    'Django.views.generic.simple',
    (r'^', 'direct_to_template', {"template": "base.html"}),
)
4
catherine

Ich würde die URLs als solche neu organisieren:

urlpatterns = patterns('',
    (r'^admin/doc/', include('Django.contrib.admindocs.urls')),
    (r'^admin/', include(admin.site.urls)),
    (r'^tinymce/', include('tinymce.urls')),
    (r'^blog/', include('hellodjango.blog.urls')),
    (r'^$', direct_to_template, {"template": "base.html"}),
)

Die Muster entsprechen ihrer Spezifität, daher neige ich dazu, die spezifischeren Muster an erster Stelle zu setzen. Ansonsten sehen Sie möglicherweise unerwartetes Verhalten. Probieren Sie es aus, und wenn es noch eine Vorlage aus Ihrem Blog lädt, die /-Anforderung enthält, werden wir ausführlicher vorgehen.

2
Brandon

Ich denke, es hängt davon ab, was Ihre Homepage sein soll. Wenn es sich einfach um eine Seite mit Links zu anderen Teilen Ihrer Website handelt, dann ist catherine's answer eine schöne saubere Methode.

Wenn Sie möchten, dass der Stamm Ihrer Website beispielsweise Ihr Blog ist, würde ich Folgendes tun:

urlpatterns = patterns('',
    # Django Admin
    url(r'^admin/', include(admin.site.urls)),
    # Tiny MCE Urls
    url(r'^tinymce/', include('tinymce.urls')),
    # Other App
    url(r'^other/', include('projectname.other.urls', namespace='other')),
    # Blog App
    url(r'^', include('projectname.blog.urls', namespace='blog')),
)

Vergessen Sie auch nicht, den Platz für Ihre URL anzugeben: https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

0
krak3n