369 votos

¿Puedo acceder a las constantes en settings.py de plantillas en Django?

Tengo algunas cosas en settings.py que me gustaría ser capaz de acceder a partir de una plantilla, pero no puedo encontrar la manera de hacerlo. Ya he probado

 {{CONSTANT_NAME}}
 

pero eso no parece funcionar. ¿Es esto posible?

443voto

bchhun Puntos 7116

Si es un valor que te gustaría tener para cada solicitud y de la plantilla, el uso de un contexto procesador es el más apropiado.

He aquí cómo:

  1. Hacer un *context_processors.py* archivo en su directorio de aplicaciones. Digamos que yo quiero tener la ADMIN_PREFIX_VALUE valor en cada contexto:

    from django.conf import settings # import the settings file
    
    def admin_media(request):
        # return the value you want as a dictionnary. you may add multiple values in there.
        return {'ADMIN_MEDIA_URL': settings.ADMIN_MEDIA_PREFIX}
    
  2. agregue su contexto procesador para su settings.py archivo:

    TEMPLATE_CONTEXT_PROCESSORS = (
        # whatever comes before
        "your_app.context_processors.admin_media",
    )
    
  3. Uso RequestContext desde su punto de vista para agregar su contexto procesadores en su plantilla:

    from django.template import Template, context, RequestContext
    from django.shortcuts import render_to_response
    
    def my_view(request):
        return render_to_response(
            "index.html",
            context_instance=RequestContext(request)
        )
    
  4. y por último, en la plantilla:

    ...
    <a href="{{ ADMIN_MEDIA_URL }}">path to admin media</a>
    ...
    

269voto

Berislav Lopac Puntos 3251

Me parece que el enfoque más simple es una sola etiqueta de plantilla:

 from django import template
from django.conf import settings

register = template.Library()

# settings value
@register.simple_tag
def settings_value(name):
    return getattr(settings, name, "")
 

Uso:

 {% settings_value "LANGUAGE_CODE" %}
 

184voto

Prairiedogg Puntos 3594

Django proporciona el acceso a determinados, con frecuencia se utiliza la configuración de las constantes para la plantilla como settings.MEDIA_URL y algunos de los ajustes de idioma si usted usa django construido en el genérico de opiniones o pasar en un contexto palabra clave de la instancia en el argumento de la render_to_response función de acceso directo. He aquí un ejemplo de cada caso:

from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic.simple import direct_to_template

def my_generic_view(request, template='my_template.html'):
    return direct_to_template(request, template)

def more_custom_view(request, template='my_template.html'):
    return render_to_response(template, {}, context_instance=RequestContext(request))

Estas opiniones ambos tienen varias configuraciones utilizadas frecuentemente como settings.MEDIA_URL disponible de la plantilla como {{ MEDIA_URL }}, etc.

Si usted está buscando para el acceso a otras constantes en la configuración y, a continuación, simplemente descomprimir las constantes que desee y añádalos al contexto diccionario que está utilizando en su función de vista, así:

from django.conf import settings
from django.shortcuts import render_to_response

def my_view_function(request, template='my_template.html'):
    context = {'favorite_color': settings.FAVORITE_COLOR}
    return render_to_response(template, context)

Ahora puede acceder a settings.FAVORITE_COLOR de su plantilla como {{ favorite_color }}.

46voto

chrisdew Puntos 6165

Otra forma de hacer esto es crear una etiqueta de plantilla personalizada que le puede dejar que los valores de pescado de la configuración.

 @register.tag
def value_from_settings(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, var = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
    return ValueFromSettings(var)

class ValueFromSettings(template.Node):
    def __init__(self, var):
        self.arg = template.Variable(var)
    def render(self, context):        
        return settings.__getattr__(str(self.arg))
 

A continuación, puede utilizar:

 {% value_from_settings "FQDN" %}
 

imprimirlo en cualquier página, sin saltar a través de aros contexto en el procesador.

8voto

IanSR Puntos 475

El ejemplo anterior de bchhun está bien, excepto que usted necesita para construir explícitamente su diccionario contexto de settings.py. A continuación se muestra un ejemplo no probado de cómo se puede auto-construir el diccionario contexto de todo en mayúsculas atributos de settings.py (re: "^ [A-Z0-9 _] $").

Al final de settings.py:

 _context = {} 
local_context = locals()
for (k,v) in local_context.items():
    if re.search('^[A-Z0-9_]+$',k):
        _context[k] = str(v)

def settings_context(context):
    return _context

TEMPLATE_CONTEXT_PROCESSORS = (
...
'myproject.settings.settings_context',
...
)
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X