Django vue de charge modèle à partir de l'appel de l'application dir première
J'essaie de garder un peu le schéma cohérent de nommage sur mes modèles HTML. I. e. index.html pour le principal, delete.html pour supprimer la page et ainsi de suite. Mais le app_directories
chargeur semble toujours charger le modèle de l'app qui est premier dans l'ordre alphabétique.
Est-il possible de toujours vérifier pour un match à l'appel de l'application templates
répertoire?
Paramètres pertinents dans mon settings.py
:
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
TEMPLATE_LOADERS = (
'django.template.loaders.app_directories.load_template_source',
'django.template.loaders.filesystem.load_template_source',
)
TEMPLATE_DIRS = (
os.path.join(PROJECT_PATH, 'templates'),
)
J'ai essayé de changer l'ordre de TEMPLATE_LOADERS
, sans succès.
Modifier comme demandé par Ashok:
Dir de la structure de chaque application:
templates/
index.html
add.html
delete.html
create.html
models.py
test.py
admin.py
views.py
Dans chaque application views.py:
def index(request):
# code...
return render_to_response('index.html', locals())
def add(request):
# code...
return render_to_response('add.html', locals())
def delete(request):
# code...
return render_to_response('delete.html', locals())
def update(request):
# code...
return render_to_response('update.html', locals())
- pouvez-vous fournir la structure de votre "templates" répertoire et un code d'exemple de la façon dont vous chargez/rendu le modèle
- Le app_directories chargeur semble un peu trompeur pour moi. J'aurais cru qu'il serait de charger les modèles de la corriger répertoire applications, tout comme vous. Après tout, n'est-ce pas le point de django app pour être en mesure de créer des tranches séparées?
Vous devez vous connecter pour publier un commentaire.
La raison pour cela est que la app_directories chargeur est essentiellement le même que l'ajout de chaque application du modèle de dossier à la TEMPLATE_DIRS, p. ex. comme
Le problème, c'est que comme vous l'avez mentionné, l'index.html vous trouverez toujours dans app1/templates/index.html au lieu de toute autre application. Il n'y a pas de solution facile grâce à la magie corriger ce problème sans modifier le app_directories chargeur et l'utilisation de l'introspection ou le passage de l'information de l'application, ce qui devient un peu compliqué. Une solution plus facile:
Pour un exemple plus concret:
Puis dans les vues:
Vous pouvez même écrire un wrapper pour automatiser les préfixant le nom de l'application à l'ensemble de vos points de vue, et même qui pourrait être étendu à l'utilisation de l'introspection, par exemple:
L' _____nom_____.split(".")[-2] suppose que le fichier est dans un paquet, donc il tournera par exemple 'app1.vues' dans 'app1' à ajouter le nom du modèle. Cela suppose également un utilisateur de ne jamais renommer votre application sans renommer le dossier dans le répertoire des modèles, ce qui peut ne pas être une hypothèse sûre à faire et dans ce cas il suffit de coder en dur le nom du dossier dans le répertoire des modèles.
"APP_DIRS": True
serait pour toujours. Si le nom du modèle est le même, il a encore besoin de quelques préfixe pour rendre le modèle de chargeur pour les distinguer. Mais je me demande si je crée un sous-répertoiretemplates
dossier à la racine, et de mettre tout ce que l'application du modèle de là, pourrait-il être une bonne solution?render_to_response
méthode est obsolète depuis la version 2.0. LIENJe sais que c'est un vieux thread, mais j'ai fait quelque chose de réutilisable, qui permet de plus simple namespacing. Vous pouvez charger la suit comme un Modèle de Chargeur. Il va trouver
appname/index.html
dansappname/templates/index.html
.Gist disponible ici: https://gist.github.com/871567
La app_loader recherche de modèles au sein de vos applications afin qu'ils sont spécifiés dans votre INSTALLED_APPS. (http://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types).
Ma suggestion est de faire précéder le nom de votre fichier de modèle avec le nom de l'application pour éviter ces conflits de noms.
Par exemple, le modèle dir pour app1 ressemblerait à: