Los procesadores de contexto son más adecuados para manejar datos de objetos más dinámicos; se definen como un mapeo en el documentation y en muchos de los mensajes aquí se están modificando o transmitiendo a vistas: no lo hace tiene sentido que una plantilla pueda perder acceso a la información global porque, por ejemplo, olvidó usar un procesador de contexto especializado en la vista. Los datos son globales por definición & que une la vista a la plantilla.
Una mejor manera es definir una etiqueta de plantilla personalizada.De esta manera:
- plantillas no están confiando en vistas a tener información mundial pasó a ellos
- está seco-er: la aplicación que define la configuración global puede ser exportado a muchos proyectos, eliminando código común a través de proyectos
- plantillas de decidir si tienen acceso a la información global, no las funciones de vista
en el ejemplo siguiente trato con su problema - la carga en este MIN_TIME_TEST variables - y un problema que comúnmente se enfrento, carga en URLs que cambian cuando mi entorno c ahorca
tengo 4 ambientes - 2 dev y 2 de producción:
- Dev: django-servidor web, url: localhost: 8000
- Dev: servidor web Apache: URL: sandbox.com -> resuelve a 127.0.0.1
- servidor de caja de arena Prod, url: sandbox.domain.com
- Prod servidor: URL: domain.com
lo hago en todos mis proyectos & mantener todas las direcciones URL en un archivo, global_settings.py por lo que es accesible desde el código. Defino una etiqueta de plantilla personalizada {% site_url%} que se puede (opcionalmente) cargar en cualquier plantilla
Creo una aplicación llamada global_settings, y me aseguro de que esté incluida en mi configuración.INSTALLED_APPS tuple.
Django recoge el texto de plantilla en los nodos con un método render() que indica cómo se deben mostrar los datos -. He creado un objeto que representa los datos por returnning valores en mi global_settings.py basado en el nombre pasado en
Parece que este:
from django import template
import global_settings
class GlobalSettingNode(template.Node):
def __init__(self, settingname):
self.settingname = settingname;
def render(self, context):
if hasattr(global_settings, self.settingname):
return getattr(global_settings, self.settingname)
else:
raise template.TemplateSyntaxError('%s tag does not exist' % self.settingname)
Ahora, en global_settings.py Cómo registro un par de tags: site_url para mi ejemplo y min_test_time por su ejemplo. De esta forma, cuando se invoca {% min_time_test%} desde una plantilla, se llamará a get_min_time_test, que resuelve cargar en el valor = 5. En mi ejemplo, {% site_url%} hará una búsqueda basada en el nombre para que pueda mantener las 4 URL definidas a la vez y elegir qué entorno estoy usando. Esto es más flexible para mí que simplemente usar las configuraciones integradas de Django. Debug = indicador verdadero/falso.
from django import template
from templatenodes import GlobalSettingNode
register = template.Library()
MIN_TIME_TEST = 5
DEV_DJANGO_SITE_URL = 'http://localhost:8000/'
DEV_APACHE_SITE_URL = 'http://sandbox.com/'
PROD_SANDBOX_URL = 'http://sandbox.domain.com/'
PROD_URL = 'http://domain.com/'
CURRENT_ENVIRONMENT = 'DEV_DJANGO_SITE_URL'
def get_site_url(parser, token):
return GlobalSettingNode(CURRENT_ENVIRONMENT)
def get_min_time_test(parser, token):
return GlobalSettingNode('MIN_TIME_TEST')
register.tag('site_url', get_site_url)
register.tag('min_time_test', get_min_time_test)
Tenga en cuenta que para que esto funcione, Django espera global_settings.py que se encuentra en una pitón empaquetado llamados templatetags debajo de la aplicación de Django. Mi aplicación Django que aquí se llama global_settings, por lo que mi estructura de directorios se parece a:
/project-name/global_settings/templatetags/global_settings.py etc.
Finalmente la plantilla elige si para cargar los valores globales o no , que es beneficioso para el rendimiento. Agregue esta línea a su plantilla para exponer todas las etiquetas registradas en global_settings.PY:
{% load global_settings %}
Ahora, otros proyectos que necesitan MIN_TIME_TEST o estos ambientes expuestos simplemente puede instalar esta aplicación =)
Gracias, de hecho es la dirección que quiero ir. Pero, por favor, consulte mi aclaración/otra pregunta, es decir, ¿cómo puedo hacer lo que dice sin tener que enumerar todas las constantes dos veces? –
Envuélvalos todos en un diccionario y luego ponga ese diccionario en contexto. Accederá a ellos mediante notación de puntos. ej .: {{yourDict.yourConstant}} –