Quel est le meilleur emplacement pour placer des modèles dans le projet django?

Quel est le meilleur emplacement pour placer des modèles dans le projet django?

Extrait du livre de Django, chapitre 4 :

Si vous ne pouvez pas trouver un endroit évident pour placer vos modèles, nous vous recommandons de créer un répertoire de modèles dans votre projet Django (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 bien fonctionné pour moi.

Ma structure de répertoire ressemble à ceci:

/media pour tous mes CSS / JS / images etc
/templates pour mes templates
/projectname du projet pour le code du projet principal (c.-à-d. le code Python)

Placé dans //templates//template.html pour les modèles spécifiques à l’application pour vous aider à rendre l’application réutilisable ailleurs.

Pour les modèles “globaux” généraux, je les place dans /templates/template.html

Suite de Dominic et dlrust,

Nous utilisons une dissortingbution de source setuptools (sdist) pour mettre en package notre projet django et les 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 afin qu’ils puissent être empaquetés par setuptools.

Par exemple, notre modèle et les chemins statiques ressemblent à:

 PROJECT/APP/templates/APP/template.html PROJECT/APP/static/APP/my.js 

Pour que cela fonctionne, MANIFEST.in doit être modifié (voir http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )

Un exemple du 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 configuration django que le chargeur app_directories se trouve dans votre TEMPLATE_LOADERS. Je pense que c’est par défaut dans django 1.4.

Un exemple des chargeurs de gabarits de parameters 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 demanderiez pourquoi nous utilisons sdists au lieu de simplement copier des fichiers rsync; Cela fait partie de notre stream de travail de gestion de la configuration où nous avons une archive de génération unique qui est déployée avec PIP inchangé dans les environnements de test, d’acceptation et de production.

DJANGO 1.11

append le dossier templates où existe le fichier manage.py, qui est votre répertoire de base. changer le DIRS pour les modèles comme suit dans vos parameters.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.consortingb.auth.context_processors.auth', 'django.consortingb.messages.context_processors.messages', ], }, }, 

]

Maintenant, utilisez le modèle en utilisant le code,

 def home(request): return render(request,"index.html",{}) 

dans views.py. Cela fonctionne très bien pour Django 1.11

J’ai compris que TEMPLATE_DIRS nécessite un chemin absolu. Et je n’aime pas les chemins absolus dans mon code. Donc cela fonctionne bien pour moi, dans settings.py :

 import os TEMPLATE_DIRS = ( os.path.join(os.path.dirname(os.path.realpath(__file__)), "../APPNAME/templates") ) 

Vous pouvez également envisager d’avoir vos modèles dans une firebase database, 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 souplesse sur le côté import / sync vers / du système de fichiers.

[edit: 20 août 2018 – ce repository n’est pas disponible, il est disponible sur https://github.com/jazzband/django-dbtemplates et a été mis à jour il ya 8 mois. Je n’utilise plus Django de manière significative, donc je ne peux pas le garantir.]

C’est plus un choix personnel au niveau du projet. Si vous parlez d’applications qui doivent être connectables, un répertoire de modèles dans votre application est l’endroit où elles vont par défaut. Mais à l’échelle du projet, c’est ce qui fonctionne le mieux pour vous.

Django 1.10

TEMPLATE_DIRS est obsolète.

Maintenant, nous devons 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 des modèles, 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 cherche un modèle comme celui-ci:

  • DIRS définit une liste de répertoires dans lesquels le moteur doit rechercher des fichiers sources de modèles, dans l’ordre de recherche.
  • APP_DIRS indique si le moteur doit rechercher les modèles dans les applications installées. Chaque backend définit un nom conventionnel pour le sous-répertoire dans les applications où ses modèles doivent être stockés.

Plus d’informations: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

La solution précédente ne fonctionnait pas dans mon cas. J’ai utilisé:

 TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]