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