Eu tenho algumas coisas em settings.py que gostaria de acessar de um modelo, mas não consigo descobrir como fazê-lo. Eu já tentei
{{CONSTANT_NAME}}
mas isso não parece funcionar. Isso é possível?
django
django-templates
django-settings
Paul Wicks
fonte
fonte
Respostas:
O Django fornece acesso a certas constantes de configurações usadas com freqüência ao modelo como
settings.MEDIA_URL
e algumas das configurações de idioma se você usar visualizações genéricas incorporadas pelo django ou passar um argumento de palavra-chave da instância de contexto narender_to_response
função de atalho. Aqui está um exemplo de cada caso:Essas visualizações terão várias configurações usadas com frequência, como
settings.MEDIA_URL
disponíveis para o modelo como{{ MEDIA_URL }}
etc.Se você estiver procurando acesso a outras constantes nas configurações, basta descompactar as constantes desejadas e adicioná-las ao dicionário de contexto que você está usando na função de visualização, da seguinte forma:
Agora você pode acessar
settings.FAVORITE_COLOR
no seu modelo como{{ favorite_color }}
.fonte
django-settings-export
para evitar a necessidade de escrever esse código em todas as visualizações.Se é um valor que você gostaria de ter para cada solicitação e modelo, usar um processador de contexto é mais apropriado.
Aqui está como:
Crie um
context_processors.py
arquivo no diretório do seu aplicativo. Digamos que eu quero ter oADMIN_PREFIX_VALUE
valor em todos os contextos:adicione seu processador de contexto ao seu arquivo settings.py :
Use
RequestContext
na sua exibição para adicionar seus processadores de contexto ao seu modelo. Orender
atalho faz isso automaticamente:e, finalmente, no seu modelo:
fonte
context_process.py
ao lado do meusettings.py
arquivo e adicionei"context_processors.admin_media"
à minhaTEMPLATE_CONTEXT_PROCESSORS
lista. Além disso, convém adicionar uma observação em sua resposta sobre o fato de que o valor padrão de TEMPLATE_CONTEXT_PROCESSORS não está vazio; portanto, se algum código existente usar algum dos valores definidos por esses processadores de contexto padrão, eles não funcionarão, a menos que você os adicione novamente para a lista explicitamente.render
atalho para evitar ter de incluir explicitamente RequestContext: docs.djangoproject.com/en/1.6/topics/http/shortcuts/#renderAcho que a abordagem mais simples é uma única tag de modelo personalizado :
Uso:
fonte
{% settings_value "DATABASES" %}
:? Esse caso de uso deve deixar óbvio por que as configurações não estão disponíveis nos modelos para começar.templatetags
pasta dentro do seu aplicativo com um__init__.py
arquivo vazio e esse códigosettings.py
dentro dessa pasta. 2) no seu modelo você adiciona{% load settings %}
e depois usa sua nova tag!Confira
django-settings-export
(isenção de responsabilidade: sou o autor deste projeto).Por exemplo...
settings.py
template.html
fonte
render
e nãorender_to_response
Outra maneira de fazer isso é criar uma tag de modelo personalizada que pode permitir que você pesque valores fora das configurações.
Você pode então usar:
imprimi-lo em qualquer página, sem pular os bastidores do processador de contexto.
fonte
Gosto da solução de Berislav, porque em sites simples ela é limpa e eficaz. O que eu NÃO gosto é de expor todas as constantes de configurações, quer ou não. Então o que acabei fazendo foi o seguinte:
Uso:
Isso protege todas as constantes que você não nomeou para uso no modelo e, se quiser ser realmente sofisticado, pode definir uma tupla nas configurações e criar mais de uma marca de modelo para diferentes páginas, aplicativos ou áreas, e simplesmente combine uma tupla local com a tupla de configurações, conforme necessário, e faça a compreensão da lista para ver se o valor é aceitável.
Concordo que, em um site complexo, isso é um pouco simplista, mas há valores que seria bom ter universalmente em modelos, e isso parece funcionar bem. Obrigado a Berislav pela ideia original!
fonte
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
éFalse
, não substring problema aqui.if
declaração? Eu quero verificar oDEBUG
valorEu melhorei a resposta de chrisdew (para criar a sua própria etiqueta) um pouco.
Primeiro, crie o arquivo
yourapp/templatetags/value_from_settings.py
no qual você define sua própria nova tagvalue_from_settings
:Você pode usar essa tag no seu modelo por:
ou via
A vantagem da
as ...
notação é que isso facilita o uso emblocktrans
blocos por meio de um simples{{my_fqdn}}
.fonte
Adicionando uma resposta com instruções completas para criar uma tag de modelo personalizada que resolve isso, com o Django 2.0+
Na sua pasta de aplicativos, crie uma pasta chamada tags de modelo . Nele, crie __init__.py e custom_tags.py :
No custom_tags.py, crie uma função de tag personalizada que forneça acesso a uma chave arbitrária na constante de configurações :
Para entender esse código, recomendo a leitura da seção sobre tags simples nos documentos do Django.
Então, você precisa tornar o Django ciente dessa tag personalizada (e de qualquer outra adicional) carregando esse arquivo em qualquer modelo em que você o usará. Assim como você precisa carregar a tag estática incorporada:
Com ele carregado, ele pode ser usado como qualquer outra tag, basta fornecer a configuração específica que você precisa retornar. Portanto, se você tiver uma variável BUILD_VERSION em suas configurações:
Essa solução não funcionará com matrizes, mas se você precisar, poderá colocar muita lógica em seus modelos.
Nota: Uma solução mais limpa e à prova de falhas provavelmente seria criar um processador de contexto personalizado onde você adiciona as configurações necessárias a um contexto disponível para todos os modelos. Dessa forma, você reduz o risco de gerar configurações confidenciais em seus modelos por engano.
fonte
Adicione este código a um arquivo chamado
context_processors.py
:E, em seu arquivo de configurações, inclua um caminho como
'speedy.core.base.context_processors.settings'
(com o nome e o caminho do seu aplicativo) no diretório'context_processors'
configurações emTEMPLATES
.(Você pode ver, por exemplo, settings / base.py e context_processors.py ).
Em seguida, você pode usar a configuração específica em qualquer código de modelo. Por exemplo:
Atualização: o código acima expõe todas as configurações aos modelos, incluindo informações confidenciais como a sua
SECRET_KEY
. Um hacker pode abusar desse recurso para exibir essas informações nos modelos. Se você deseja expor apenas configurações específicas aos modelos, use este código:fonte
SECRET_KEY
. Um hacker pode abusar desse recurso para exibir essas informações nos modelos.O exemplo acima de bchhun é bom, exceto que você precisa criar explicitamente seu dicionário de contexto a partir de settings.py. Abaixo está um exemplo UNTESTED de como você pode criar automaticamente o dicionário de contexto a partir de todos os atributos em maiúsculas de settings.py (re: "^ [A-Z0-9 _] + $").
No final de settings.py:
fonte
Se alguém encontrar essa pergunta como eu, postarei minha solução que funciona no Django 2.0:
Essa tag atribui algum valor da variável settings.py à variável do modelo:
Uso:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Seu modelo:
Veja a documentação do Django como criar tags de modelo personalizadas aqui: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
fonte
{% if settings_debug %}
{% if settings_debug == True %}
para o sugerido{% if settings_debug %}
Se estiver usando uma exibição baseada em classe:
fonte
Eu achei que essa era a abordagem mais simples para o Django 1.3:
views.py
hero.html
fonte
IanSR e bchhun sugeriram substituir TEMPLATE_CONTEXT_PROCESSORS nas configurações. Esteja ciente de que essa configuração tem um padrão que pode causar algumas coisas estranhas se você a substituir sem redefinir os padrões. Os padrões também foram alterados nas versões recentes do Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
O padrão TEMPLATE_CONTEXT_PROCESSORS:
fonte
Se comparássemos as tags de contexto versus modelo em uma única variável, conhecer a opção mais eficiente poderia ser benéfico. No entanto, é melhor mergulhar nas configurações apenas de modelos que precisam dessa variável. Nesse caso, não faz sentido passar a variável para todos os modelos. Mas se você estiver enviando a variável para um modelo comum, como o modelo base.html, isso não importaria, pois o modelo base.html é renderizado em todas as solicitações, para que você possa usar os dois métodos.
Se você optar por usar a opção de tags de modelo, use o código a seguir, pois ele permite passar um valor padrão , caso a variável em questão não esteja definida.
Exemplo: get_from_settings my_variable como my_context_value
Exemplo: get_from_settings my_variable my_default como my_context_value
fonte
SITE_EXTRA_CONTEXT_DICT
em finalware para fazer isso por você.