- 1. Fazit
In Django – Lektion 035. Unterschiedliche Vorlagen zum Rendern verschiedener Arten von Inhalten in Suchergebnissen wurde gezeigt, wie unterschiedliche Vorlagen je nach Inhaltstyp gerendert werden in den Ergebnissen der Site-Suche gerendert werden. Dabei war der entscheidende Punkt, dass es nicht erforderlich war, Bedingungen für die Überprüfung der Auswahl einer Vorlage zu stellen. Die Sprechblaseninformationen wurden in der Variablen TEMPLATE_PREVIEW gespeichert, über die die Vorlage in das enthaltene Tag in der Django-Vorlage eingefügt wurde.
{% include object.TEMPLATE_PREVIEW %}
Diese Methode hat einen großen Nachteil. Tatsache ist, dass das include-Tag bei jedem Aufruf nach einem Template sucht. Bei starker Auslastung der Website kann dies die Dauer der Antwort des Servers erheblich verlängern. Um dieses Problem zu lösen, müssen Sie das Muster irgendwie zwischenspeichern. Da unterschiedliche Inhaltstypen unterschiedliche Templates verwenden, ist dies mit include_tag ziemlich problematisch.
Dieses Problem wurde behoben, indem die Vorlage auf Klassenebene als Klassenvariable zwischengespeichert wurde.
Dieser Mechanismus kann mit einem Mixin implementiert werden.
class EInterfaceMixin: TEMPLATE_FULL = 'full.html' # путь к шаблону template_full = None # pattern caching variable # we will cache with the help of the class method, in which we pass the object for rendering, as well as the context of the request # request context is required to provide rendering functionality that is dependent on the current user @classmethod def __render_template_full(cls, obj, request_context): if not cls.template_full: cls.template_full = loader.get_template(cls.TEMPLATE_FULL) return cls.template_full.render({'object': obj, 'user': request_context['user']}) # method to render using context def render_template_full(self, request_context): return self.__render_template_full(self, request_context)
Der nächste Schritt besteht darin, das integrierte Tag zu registrieren. Dies ist notwendig, um den Anforderungskontext beim Rendern im Template aufzunehmen. In meinem Fall können einige der Vorlagen ohne Informationen über den aktuellen Benutzer, der sich auf der Website befindet, nicht korrekt angezeigt werden.
@register.simple_tag(takes_context=True) def render_template_full(context, obj): if obj: return obj.render_template_full(context) return ''
In Vorlage verwenden
{% load render_template_full from core %} {% for object in object_list %} {% render_template_full object %} {% empty %}
Fazit
Dieses Mixin kann allen Modellen hinzugefügt werden, die diese Render-Engine verwenden.
Beim ersten Aufruf einer Klassenmethode wird die Vorlage zwischengespeichert. Nachfolgende Renderaufrufe verwenden die bereits zwischengespeicherte Vorlage. Somit wird bei jedem Aufruf des include -Tags keine unnötige CPU-Zeit mit der Suche nach einer Vorlage verschwendet.