Actualmente estoy revisando los permisos en mis plantillas para decidir si quiero o no mostrar un enlace en particular.
Esto funciona muy bien para mi base.html que se extiende en mis plantillas normales:
base.html
{% if perms.myapp.can_add %} #display link {% endif %}mi plantilla
{% extends "riskass/base.html" %} {% block content %} # do stuff # {% endblock %}PERO también uso etiquetas de plantilla para elementos repetitivos en la plantilla, y las mismas comprobaciones de permisos no parecen funcionar en ellos.
¿Alguien tiene una idea de lo que podría estar haciendo mal? Gracias !
mi plantilla
{% extends "riskass/base.html" %} {% load show_items %} {% block content %} # do stuff # {% show_items items_list%} {% endblock %}templatetags/show_items.py
from django import template register = template.Library() @register.inclusion_tag('myapp/show_items.html') def show_items(items): return {'items': items}miaplicación/mostrar_elementos.html
{% for item in items%} # display stuff: this works ... # check permissions: {% if perms.myapp.can_add %} #display other link: doesn't do anything {% endif %}perms es parte del contexto de la plantilla en el que se representa su plantilla "mi plantilla". Pero su plantilla de etiqueta de inclusión myapp/show_item.html de forma predeterminada tiene su propio contexto y no heredará perms ni ninguna otra variable de plantilla a menos que lo organice takes_context=True en el registro de su etiqueta, además de hacer solo un poco de código para pasar parte o todo ese contexto a su contexto de plantilla de etiqueta.
Hay un ejemplo de esto en los documentos de Django:
https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#inclusion-tags
Es un poco confuso porque los documentos parecen implicar que puede pasar sus propios argumentos al método de etiqueta o pasar contexto, pero no ambos. Sin embargo, este no es el caso. Cuando takes_context=True a @register.inclusion_tag() , el efecto será que django pasa el context como el primer argumento a su función de etiqueta, seguido de cualquier argumento que desee pasar a su etiqueta. El contexto que se pasa es el de la plantilla donde se encuentra su etiqueta... por lo que puede tomar lo que necesita de allí y pasarlo a la plantilla incluida, por ejemplo:
@register.inclusion_tag('riskass/show_ratings.html', takes_context=True) def show_ratings(context, ratings): return { 'ratings': ratings, 'perms': context.get('perms', None) }El uso de la etiqueta se vería así:
{% show_ratings ratings_list %}Hay información útil en esta otra pregunta y respuesta de Stack Overflow, aunque no es exactamente lo mismo que su pregunta, es posible que desee echar un vistazo:
Pasar una variable de contexto a través de una etiqueta de inclusión