Tengo algunas cosas en settings.py a las que me gustaría poder acceder desde una plantilla, pero no puedo entender cómo hacerlo. Ya lo intenté
{{CONSTANT_NAME}}
Pero eso no parece funcionar. es posible?
django
django-templates
django-settings
Paul Wicks
fuente
fuente
Respuestas:
Django proporciona acceso a ciertas constantes de configuración de uso frecuente de la plantilla, como
settings.MEDIA_URL
algunas de las configuraciones de idioma, si utiliza las vistas genéricas integradas de django o pasa un argumento de palabra clave de instancia de contexto en larender_to_response
función de acceso directo. Aquí hay un ejemplo de cada caso:Estas vistas tendrán varias configuraciones de uso frecuente como
settings.MEDIA_URL
disponibles para la plantilla como{{ MEDIA_URL }}
, etc.Si está buscando acceso a otras constantes en la configuración, simplemente desempaquete las constantes que desee y agréguelas al diccionario de contexto que está utilizando en su función de visualización, de esta manera:
Ahora puede acceder
settings.FAVORITE_COLOR
a su plantilla como{{ favorite_color }}
.fuente
django-settings-export
para evitar la necesidad de escribir este código en cada vista.Si es un valor que le gustaría tener para cada solicitud y plantilla, es más apropiado usar un procesador de contexto .
Así es cómo:
Crea un
context_processors.py
archivo en el directorio de tu aplicación. Digamos que quiero tener elADMIN_PREFIX_VALUE
valor en cada contexto:agregue su procesador de contexto a su archivo settings.py :
Use
RequestContext
en su vista para agregar sus procesadores de contexto en su plantilla. Elrender
atajo hace esto automáticamente:y finalmente, en tu plantilla:
fuente
context_process.py
justo al lado de misettings.py
archivo y agregué"context_processors.admin_media"
a miTEMPLATE_CONTEXT_PROCESSORS
lista. Además, es posible que desee agregar una nota en su respuesta sobre el hecho de que el valor predeterminado de TEMPLATE_CONTEXT_PROCESSORS no está vacío, por lo que si algún código existente usa alguno de los valores establecidos por esos procesadores de contexto predeterminados, no funcionarán a menos que los vuelva a agregar a la lista explícitamente.render
acceso directo para evitar tener que incluir explícitamente RequestContext: docs.djangoproject.com/en/1.6/topics/http/shortcuts/#renderEncuentro que el enfoque más simple es una sola etiqueta de plantilla personalizada :
Uso:
fuente
{% settings_value "DATABASES" %}
:? Este caso de uso debería hacer obvio por qué la configuración no está disponible en las plantillas para empezar.templatetags
carpeta dentro de su aplicación con un__init__.py
archivo vacío y este código comosettings.py
dentro de esa carpeta. 2) en su plantilla agrega{% load settings %}
y luego usa su nueva etiqueta.Echa un vistazo
django-settings-export
(descargo de responsabilidad: soy el autor de este proyecto).Por ejemplo...
settings.py
template.html
fuente
render
y norender_to_response
Otra forma de hacerlo es crear una etiqueta de plantilla personalizada que le permita extraer valores de la configuración.
Entonces puedes usar:
para imprimirlo en cualquier página, sin saltar por los aros del procesador de contexto.
fuente
Me gusta la solución de Berislav, porque en sitios simples, es limpia y efectiva. Lo que NO me gusta es exponer todas las constantes de configuración willy-nilly. Entonces, lo que terminé haciendo fue esto:
Uso:
Esto protege las constantes que no ha nombrado del uso en la plantilla, y si desea ser realmente elegante, puede establecer una tupla en la configuración y crear más de una etiqueta de plantilla para diferentes páginas, aplicaciones o áreas, y simplemente combine una tupla local con la tupla de configuración según sea necesario, luego comprenda la lista para ver si el valor es aceptable.
Estoy de acuerdo, en un sitio complejo, esto es un poco simplista, pero hay valores que sería bueno tener universalmente en las plantillas, y esto parece funcionar bien. ¡Gracias a Berislav por la idea original!
fuente
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
esFalse
, no hay problema de subcadena aquí.if
declaración? quiero verificar elDEBUG
valorMejoré un poco la respuesta de chrisdew (para crear tu propia etiqueta).
Primero, cree el archivo
yourapp/templatetags/value_from_settings.py
en el que define su propia etiqueta nuevavalue_from_settings
:Puede usar esta etiqueta en su plantilla a través de:
o vía
La ventaja de la
as ...
notación es que esto hace que sea fácil de usar enblocktrans
bloques a través de un simple{{my_fqdn}}
.fuente
Agregar una respuesta con instrucciones completas para crear una etiqueta de plantilla personalizada que resuelva esto, con Django 2.0+
En su carpeta de aplicaciones, cree una carpeta llamada templatetags . En él, cree __init__.py y custom_tags.py :
En custom_tags.py, cree una función de etiqueta personalizada que proporcione acceso a una clave arbitraria en la configuración constante:
Para entender este código, recomiendo leer la sección sobre etiquetas simples en los documentos de Django.
Luego, debe informar a Django sobre esta etiqueta personalizada (y cualquier otra adicional) cargando este archivo en cualquier plantilla donde la vaya a usar. Al igual que necesita cargar la etiqueta estática integrada:
Una vez cargado, puede usarse como cualquier otra etiqueta, solo proporcione la configuración específica que necesita devolver. Entonces, si tiene una variable BUILD_VERSION en su configuración:
Esta solución no funcionará con matrices, pero si lo necesita, podría estar poniendo mucha lógica en sus plantillas.
Nota: Una solución más limpia y segura probablemente sería crear un procesador de contexto personalizado donde agregue la configuración que necesita a un contexto disponible para todas las plantillas. De esta forma, reduce el riesgo de generar configuraciones confidenciales en sus plantillas por error.
fuente
Agregue este código a un archivo llamado
context_processors.py
:Y luego, en su archivo de configuración, incluya una ruta como
'speedy.core.base.context_processors.settings'
(con el nombre y la ruta de su aplicación) en la'context_processors'
configuración deTEMPLATES
.(Puede ver, por ejemplo, settings / base.py y context_processors.py ).
Luego puede usar la configuración específica en cualquier código de plantilla. Por ejemplo:
Actualización: el código anterior expone toda la configuración a plantillas, incluida información confidencial como la suya
SECRET_KEY
. Un hacker podría abusar de esta función para mostrar dicha información en las plantillas. Si desea exponer solo configuraciones específicas a las plantillas, use este código en su lugar:fuente
SECRET_KEY
. Un pirata informático puede abusar de esta función para mostrar dicha información en las plantillas.El ejemplo anterior de bchhun es bueno, excepto que necesita construir explícitamente su diccionario de contexto desde settings.py. A continuación se muestra un ejemplo NO PROBADO de cómo podría crear automáticamente el diccionario de contexto a partir de todos los atributos en mayúsculas de settings.py (re: "^ [A-Z0-9 _] + $").
Al final de settings.py:
fuente
Si alguien encuentra esta pregunta como yo, entonces publicaré mi solución que funciona en Django 2.0:
Esta etiqueta asigna algunos valores de variable settings.py a la variable de la plantilla:
Uso:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Su plantilla:
Consulte la documentación de Django sobre cómo crear etiquetas de plantilla personalizadas aquí: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
fuente
{% if settings_debug %}
{% if settings_debug == True %}
a su sugerencia{% if settings_debug %}
Si usa una vista basada en clases:
fuente
Encontré que este es el enfoque más simple para Django 1.3:
views.py
hero.html
fuente
Tanto IanSR como bchhun sugirieron anular TEMPLATE_CONTEXT_PROCESSORS en la configuración. Tenga en cuenta que esta configuración tiene un valor predeterminado que puede causar algunos problemas si lo anula sin restablecer los valores predeterminados. Los valores predeterminados también han cambiado en versiones recientes de Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
El TEMPLATE_CONTEXT_PROCESSORS predeterminado:
fuente
Si tuviéramos que comparar etiquetas de contexto frente a plantillas en una sola variable, entonces conocer la opción más eficiente podría ser beneficioso. Sin embargo, es mejor que se sumerja en la configuración solo de las plantillas que necesitan esa variable. En ese caso, no tiene sentido pasar la variable a todas las plantillas. Pero si está enviando la variable a una plantilla común como la plantilla base.html, entonces no importaría ya que la plantilla base.html se representa en cada solicitud, por lo que puede usar cualquiera de los métodos.
Si decide utilizar la opción de etiquetas de plantilla, utilice el siguiente código, ya que le permite pasar un valor predeterminado valor , en caso de que la variable en cuestión no definida.
Ejemplo: get_from_settings my_variable como my_context_value
Ejemplo: get_from_settings my_variable my_default como my_context_value
fuente
SITE_EXTRA_CONTEXT_DICT
en finalware que lo haga por usted.