Quel est le meilleur emplacement pour mettre des modèles dans le projet django?
Réponses:
Extrait du livre Django, chapitre 4 :
Si vous ne pouvez pas penser à un endroit évident pour placer vos modèles, nous vous recommandons de créer un répertoire de modèles dans votre projet Django (c'est-à-dire dans le répertoire mysite que vous avez créé au chapitre 2, si vous avez suivi nos exemples).
C'est exactement ce que je fais et cela a très bien fonctionné pour moi.
Ma structure de répertoires ressemble à ceci:
/media
pour tous mes CSS / JS / images etc
/templates
pour mes modèles
/projectname
pour le code principal du projet (ie le code Python)
Placé dans <PROJECT>/<APP>/templates/<APP>/template.html
des modèles spécifiques à l'application pour aider à rendre l'application réutilisable ailleurs.
Pour les modèles "globaux" généraux, je les mets <PROJECT>/templates/template.html
<APP>
secondes <PROJECT>/<APP>/templates/<APP>/template.html
?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
est maintenant obsolète - vous devriez plutôt ajouter DIRS=[os.path.join(BASE_DIR, "templates")]
à TEMPLATES
- voir stackoverflow.com/questions/29725132/...
À la suite de Dominic et dlrust,
Nous utilisons une distribution source setuptools (sdist) pour empaqueter notre projet django et nos applications à déployer dans nos différents environnements.
Nous avons constaté que les modèles et les fichiers statiques doivent se trouver dans les répertoires de l'application django pour pouvoir être empaquetés par setuptools.
Par exemple, notre modèle et nos chemins statiques ressemblent à:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Pour que cela fonctionne, le MANIFEST.in doit être modifié (voir http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
Un exemple de MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
De plus, vous devez confirmer dans votre fichier de paramètres django que le chargeur app_directories est dans votre TEMPLATE_LOADERS. Je pense que c'est là par défaut dans django 1.4.
Un exemple des chargeurs de modèles de paramètres django:
# 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',
)
Juste au cas où vous vous demandez pourquoi nous utilisons sdists au lieu de simplement copier les fichiers rsync; cela fait partie de notre flux de travail de gestion de la configuration où nous avons une archive tar de construction unique qui est déployée avec PIP inchangé dans les environnements de test, d'acceptation et de production.
/static/
dans votre plan de mise en page lorsque vous pensez aux modèles et aux applications modulaires. Vous voudrez peut-être mentionner une autre bonne pratique, en plaçant les css
fichiers dans un dossier appelé de la static/app/css
même manière pour js
et peut-être jpg
ou simplement /static/app/images
.
DJANGO 1.11
ajoutez le dossier de modèles où le manage.py existe, qui est votre répertoire de base. modifiez le DIRS pour les MODÈLES comme suit dans votre settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.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',
],
},
},
]
Maintenant, pour utiliser le modèle en utilisant le code,
def home(request):
return render(request,"index.html",{})
dans views.py. cela fonctionne parfaitement pour django 1.11
J'ai compris qu'il TEMPLATE_DIRS
fallait un chemin absolu. Et je n'aime pas les chemins absolus dans mon code. Donc, cela fonctionne bien pour moi, en settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR
os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS
est obsolète.
Nous devons maintenant utiliser TEMPLATE
, en introduisant dans Django 1.8 comme ceci:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Une fois que vous avez défini TEMPLATES, vous pouvez supprimer en toute sécurité ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS et TEMPLATE_STRING_IF_INVALID.
À propos du meilleur emplacement, Django recherche un modèle comme celui-ci:
Plus d'informations: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
La solution précédente n'a pas fonctionné dans mon cas. J'ai utilisé:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRS
est désormais obsolète.
BASE_DIR
os.path.join(BASE_DIR, '../myapp/templates')
Vous pouvez également envisager d'avoir vos modèles dans une base de données, en utilisant django-dbtemplates . Il est également configuré pour la mise en cache et l'application django-reversion qui vous aide à conserver les anciennes versions de vos modèles.
Cela fonctionne assez bien, mais je préférerais un peu plus de flexibilité sur le côté import / sync vers / depuis le système de fichiers.
[modifier: 20 août 2018 - ce référentiel n'est pas disponible, un avec le même nom est disponible sur https://github.com/jazzband/django-dbtemplates et a été mis à jour il y a 8 mois. Je n'utilise plus Django de manière significative, je ne peux donc pas en garantir.]