Django marcas de modelo personalizado e carregadores modelo
-
05-07-2019 - |
Pergunta
[Eu tenho essa discussão em http: // grupos. google.com/group/django-users/browse_thread/thread/989c569d5118980d]
é 'django.template.loaders.app_directories.load_template_source' requerida nos TEMPLATE_LOADERS configuração para etiquetas modelo personalizado para trabalhos?
Sabemos que simplesmente ter uma marca personalizada no diretório templatetags de sua aplicação Django faz com que a tag disponíveis para uso na aplicação.
No caso do carregamento de modelos, nós sabemos que ter 'django.template.loaders.filesystem.load_template_source' nas TEMPLATE_LOADERS configuração em conjunto com entradas apropriadas em TEMPLATE_DIRS permite Django a modelos de carga do diretórios especificados. Isso é muito claro e lógico. Mas, no caso de marcas de modelo personalizado, eu vê-los se tornar magicamente disponível.
Então, você tem alguma idéia de como tags de modelos personalizados são encontrados / carregado / manuseado?
Solução
Não, django.template.loaders.app_directories.load_template_source
não é de todo necessário para etiquetas modelo personalizado para o trabalho.
Você não tem que especificar diretórios para dizer ao Django onde-da carga templatetags bibliotecas (como fazemos em caso de modelos), apenas coz Django assume para encontrar templatetags bibliotecas em aplicações especificadas no INSTALLED_APPS
lista.
Ele só faz um loop sobre a lista de aplicações de INSTALLED_APPS
, a importação de todas as bibliotecas de ' templatetags ' diretórios dentro e importar cada um para torná-los disponíveis. Se um diretório chamado templatetags não for encontrado, ele simplesmente ignora. Mas, ele não tentar olhar para todas as opções disponíveis em INSTALLED_APPS.
Você pode dar uma olhada no código na django/templatetags/__init__.py
, e você vai saber como templatetags feita (magicamente) disponível. Olhe para o código,
from django.conf import settings
for a in settings.INSTALLED_APPS:
try:
__path__.extend(__import__(a + '.templatetags', {}, {}, ['']).__path__)
except ImportError:
pass
É apenas adicionar aqueles lista de módulos para __path__
. E qualquer coisa listado para __path__
será tratado, como se ele também existe como um sub-módulo do módulo cuja lista __path__
qual ela aparece.