2009-07-30 10 views
4

[J'ai cette discussion à http://groups.google.com/group/django-users/browse_thread/thread/989c569d5118980d]balises de modèle Django personnalisé et chargeurs modèle

est « django.template.loaders.app_directories.load_template_source » nécessaire dans les TEMPLATE_LOADERS de réglage pour les balises de modèle personnalisés pour travail?

Nous savons que le simple fait d'avoir une balise personnalisée dans le répertoire templatetags de votre application Django rend cette balise disponible pour utilisation dans l'application.

Dans le cas de chargement des modèles, nous savons que d'avoir « django.template.loaders.filesystem.load_template_source » dans les TEMPLATE_LOADERS mise avec entrées appropriées dans Django TEMPLATE_DIRS permet de charger des modèles à partir des répertoires spécifiés. C'est assez clair et logique. Mais dans le cas des balises de modèles personnalisés, je les vois devenir magiquement disponibles.

Alors avez-vous une idée de la façon dont les balises de gabarit personnalisées sont trouvées/chargées/gérées?

Répondre

10

Non, django.template.loaders.app_directories.load_template_source n'est pas du tout requis pour que les balises de gabarit personnalisées fonctionnent.

Vous ne devez pas spécifier les répertoires de dire où django-de charger templatetags bibliothèques (comme nous le faisons dans le cas des modèles), juste coz django suppose de trouver des bibliothèques de templatetags dans les applications spécifiées dans la liste INSTALLED_APPS.

Il boucles un peu plus de la liste des applications de INSTALLED_APPS, l'importation de toutes les bibliothèques de « templatetags » répertoires à l'intérieur et importer chaque pour les rendre disponibles. Si un répertoire appelé templatetags n'est pas trouvé, il saute simplement. Mais, il essaie de regarder toutes les options disponibles dans INSTALLED_APPS.

Vous pouvez jeter un coup d'oeil au code dans django/templatetags/__init__.py, et vous saurez comment les modèles sont fabriqués (magiquement). Regardez le code,

from django.conf import settings 

for a in settings.INSTALLED_APPS: 
    try: 
     __path__.extend(__import__(a + '.templatetags', {}, {}, ['']).__path__) 
    except ImportError: 
     pass 

Il suffit d'ajouter les liste des modules à __path__. Et tout ce qui est listé à __path__ sera traité comme s'il existait également en tant que sous-module du module dont la liste __path__ apparaît.

Questions connexes