- 1. Қорытынды
Django - Lesson 035. Іздеу нәтижелерінде әртүрлі мазмұн түрлерін көрсетуге арналған әртүрлі үлгілер бөлімінде мазмұнның түріне байланысты әртүрлі үлгілерді көрсету жолы көрсетілді. сайт іздеу нәтижелерінде көрсетіледі. Бұл ретте басты мәселе үлгіні таңдауды тексеруге жағдай жасаудың қажеті жоқ еді. Шар туралы ақпарат TEMPLATE_PREVIEW айнымалысында сақталды, ол арқылы үлгі Django үлгісіндегі енгізілген тегке кірістірілді.
{% include object.TEMPLATE_PREVIEW %}
Бұл әдістің бір үлкен кемшілігі бар. Факті мынада, қосу тегі шаблонды шақырған сайын іздейді. Сайттағы ауыр жүктемемен - бұл серверден жауап беру ұзақтығын айтарлықтай арттыруы мүмкін. Бұл мәселені шешу үшін үлгіні қандай да бір түрде кэштеу керек. Әртүрлі мазмұн түрлері әртүрлі үлгілерді пайдаланатындықтан, мұны include_tag көмегімен орындау өте қиын.
Бұл мәселе үлгіні сынып айнымалысы ретінде сынып деңгейінде кэштеу арқылы шешілді.
Бұл механизм миксин көмегімен жүзеге асырылуы мүмкін.
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)
Келесі қадам - кірістірілген тегті тіркеу. Бұл үлгіде көрсету кезінде сұрау мәтінмәнін алу үшін қажет. Менің жағдайда, кейбір үлгілерді сайттағы ағымдағы пайдаланушы туралы ақпаратсыз дұрыс көрсету мүмкін емес.
@register.simple_tag(takes_context=True) def render_template_full(context, obj): if obj: return obj.render_template_full(context) return ''
Үлгіде пайдаланыңыз
{% load render_template_full from core %} {% for object in object_list %} {% render_template_full object %} {% empty %}
Қорытынды
Бұл араластырғышты осы көрсету механизмін пайдаланатын барлық үлгілерге қосуға болады.
Класс әдісі бірінші рет шақырылғанда, үлгі кэштеледі. Кейінгі көрсету қоңыраулары бұрыннан кэштелген үлгіні пайдаланады. Осылайша, include тегі шақырылған сайын үлгіні іздеуге CPU уақытының пайдасыз шығыны болмайды.