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

88

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

Vishal
la source

Réponses:

50

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:

/mediapour tous mes CSS / JS / images etc
/templatespour mes modèles
/projectnamepour le code principal du projet (ie le code Python)

Dominic Rodger
la source
1
lorsque vous placez les modèles dans / templates, existe-t-il un moyen de dire au chargeur de modèles de le charger sans spécifier le chemin complet de / template dans TEMPLATE_DIRS à charger avec django.template.loaders.filesystem.Loader? Ce serait génial de faire cela avec un chemin relatif, et sous 1.4, mon chargeur ne regarde pas sous <projet> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
87

Placé dans <PROJECT>/<APP>/templates/<APP>/template.htmldes 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

dlrust
la source
11
Vous vous demandez la raison de 2 <APP>secondes <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia
18
Le premier / app / templates consiste simplement à regrouper les modèles avec leur application appropriée. La deuxième application consiste à éviter les collisions de noms. (Vraisemblablement, vous pointerez TEMPLATE_DIRS pour pointer vers chacun de ces répertoires, mais à la fin, Django les rassemble dans un répertoire géant.) Voir: docs.djangoproject.com/en/dev/ref/templates/api
Ceasar Bautista
3
Pour que cela fonctionne (django 1.6), j'ai dû ajouter une directive pour le chargeur de modèle de système de fichiers:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman
3
Cette réponse est ancienne, mais je me suis retrouvé ici. Pour mémoire, TEMPLATE_DIRSest maintenant obsolète - vous devriez plutôt ajouter DIRS=[os.path.join(BASE_DIR, "templates")]à TEMPLATES- voir stackoverflow.com/questions/29725132/...
John Aaron
9

À 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.

l'analyste de surf
la source
1
+1 Merci d'avoir fourni les détails supplémentaires et les exemples de lignes.
gotgenes
+1 intelligent à inclure /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 cssfichiers dans un dossier appelé de la static/app/cssmême manière pour jset peut-être jpgou simplement /static/app/images.
plaques de cuisson
7

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

Alan Paul
la source
1

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.

SleighBoy
la source
1

J'ai compris qu'il TEMPLATE_DIRSfallait 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")
)
kqw
la source
1
Les projets Django ont leur chemin de base déjà défini dans le BASE_DIRos.path.join(BASE_DIR, '../APPNAME/templates')
fichier
1

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:

  • DIRS définit une liste de répertoires dans lesquels le moteur doit rechercher les fichiers source du modèle, dans l'ordre de recherche.
  • APP_DIRS indique si le moteur doit rechercher des 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

Wilfried
la source
0

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") ]
user6916739
la source
Regardez ma réponse. TEMPLATE_DIRSest désormais obsolète.
Wilfried
Les projets Django ont leur chemin de base déjà défini dans le BASE_DIRos.path.join(BASE_DIR, '../myapp/templates')
fichier
0

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.]

TonyM
la source
Quand serait-ce une bonne idée? N'est-il pas plus lent de charger des modèles à partir de la base de données?
jguffey
Ne devenez-vous pas dépendant de db si vous stockez des modèles dans db et intégrerez-vous votre base de données aux commits git? Comment allez-vous coordonner les modifications apportées par les différents utilisateurs dans les modèles?
gautamaggarwal
Cela a été écrit bien avant que je ne prenne conscience de git. Pas même sûr que j'utilisais svn à l'époque. Je recommande d'utiliser les systèmes de contrôle de version maintenant.
TonyM
@tonemcd, ce référentiel a été supprimé.
lmiguelvargasf