web-dev-qa-db-fra.com

Dossiers de modèles Django

J'expérimente avec Django et cherche à définir comment définir urls.py et comment les urls fonctionnent .J'ai configuré urls.py à la racine du projet pour diriger mon blog et mon administrateur ..__ Mais maintenant, je veux ajouter une page à ma maison, donc à localhost: 8000.

J'ai donc ajouté au code suivant l'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 des modèles dans ma racine. Qui contient la base.html

urls.py complet:

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

EDIT: ajouté complète urls.py :)

Est-ce que je néglige quelque chose?

26
Kevinvhengst

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

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 la racine de mon projet utilisé pour les modèles non-app et chaque application a un dossier templates/appname à l'intérieur de l'application elle-même. 

Si vous souhaitez utiliser un modèle à partir du dossier de modèles racine, vous devez simplement donner le nom du modèle tel que 'base.html' et si vous souhaitez utiliser un modèle d'application, vous utilisez '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
  ...
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

Je réorganiserais les urls en tant que tels:

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 motifs correspondent à leurs spécificités, j'ai donc tendance à donner la priorité aux motifs les plus spécifiques. Sinon, vous pourriez voir un comportement inattendu. Essayez-le, et s'il charge toujours un modèle de votre blog avec une demande de /, nous allons creuser plus profondément.

2
Brandon

Je pense que cela dépend de ce que vous voulez que votre page d'accueil soit. Si c'est simplement une page avec des liens vers d'autres parties de votre site, alors catherine's answer est un moyen propre et agréable.

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

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 également de nommer space votre url comprend: https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

0
krak3n