Django dossiers de modèles

Je suis en train D'expérimenter avec Django, et de trouver comment définir urls.py, et comment les URL fonctionnent. J'ai configuré urls.py dans la racine du projet, pour diriger vers mon blog et admin. Mais maintenant, je veux ajouter une page à ma maison, donc à localhost: 8000.

J'ai donc ajouté au code suivant au urls.py à la racine du projet:

from django.views.generic.simple import direct_to_template

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

Le problème est qu'il recherche le modèle dans blog/templates/... Au lieu du dossier templates dans ma racine. Qui contient la base.html

Plein 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')),
)

Modifier: ajouté complet urls.py :)

Est-ce que je néglige quelque chose?

24
demandé sur ROMANIA_engineer 2013-03-14 17:50:14

4 réponses

Avez-vous défini TEMPLATE_DIRS dans votre settings.py? Vérifiez et assurez-vous qu'il est correctement configuré avec des chemins absolus. C'est ainsi que je m'assure qu'il est correctement défini:

Settings.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',
)

De cette façon, j'ai un dossier templates dans ma racine de projet qui est utilisé pour les modèles non-app et chaque application a un dossier templates/appname dans l'application elle-même.

Si vous voulez utiliser un modèle à partir du dossier de modèle racine, vous donnez simplement le nom du modèle comme 'base.html' et si vous voulez utiliser un modèle d'application, vous utiliser 'appname/base.html'

Structure du dossier:

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
  ...
55
répondu Ngenator 2013-03-14 14:25:26
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"}),
)
3
répondu catherine 2013-03-14 14:37:44

Je réorganiserais les URL en tant que telles:

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"}),
)

Les modèles sont assortis par leur spécificité, donc j'ai tendance à mettre les modèles plus spécifiques en premier. Sinon, vous pourriez voir un comportement inattendu. Essayez-le, et s'il est toujours en train de charger un modèle à partir de votre blog sur une demande à /, nous creuserons plus profondément.

2
répondu Brandon 2013-03-14 17:34:33

Je pense que cela dépend de ce que vous voulez que votre page d'accueil. Si c'est simplement une page avec des liens vers d'autres parties de votre site, alors la réponse de catherine est une bonne façon propre.

Si vous voulez que la racine de votre site soit votre blog par exemple, je ferais ceci:

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')),
)

N'oubliez pas non plus de nommer l'espace de votre url: https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

0
répondu krak3n 2017-05-23 10:31:19