Форум сайта python.su
Привет.
Есть шаблон одного из приложений проекта (пусть будет app1).
{% extends 'base.html' %} {% block content %} <TABLE> <TR> <TD>{% block info1 %}{{ info1 }}{% endblock %}</TD> <TD>{% block info2 %}{{ info2 }}{% endblock %}</TD> </TR> </TABLE> {% endblock %}
def inf1(request): info1 = Info1.objects.get(pk=1) return render(request, 'app1_base.html', {'info1': info1}
def inf2(request): info2 = Info2.objects.get(pk=1) return render(request, 'app1_base.html', {'info2': info2}
def inf2(request): info1 = Info1.objects.get(pk=1) info2 = Info2.objects.get(pk=1) return render(request, 'app1_base.html', {'info1': info1, 'info2': info2}
Отредактировано MikaMika (Апрель 17, 2013 12:58:59)
Офлайн
Можно написать свой context processor
https://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors
Офлайн
reclosedev
Можно написать свой context processorhttps://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors
Офлайн
buddha
Не совсем понял, что вы предлагаете (process_view? process_template_response?).
Если ТС нужны данные только в шаблоне, а не во вьюхах, context processor как раз подойдет. Кмк middleware для более низкоуровневых/сложных вещей.
buddhaЭто почему?
Но в таком случае нужно будет заменить все сокращения, типа render, render_to_response на SimpleTemplateResponse\TemplateResponse.
Либо запилить декоратор.
Офлайн
Да, я имел ввиду process_template_response.
У объекта HttpResponse нету возможности(интерфейса) для добавления в контекст новых переменных(это я про render, render_to_response).
Standard HttpResponse objects are static structures. They are provided with a block of pre-rendered content at time of construction, and while that content can be modified, it isn’t in a form that makes it easy to perform modifications.Я так понял, что SimpleTemplateResponse был создан чисто под эти ситуации , да и сам этот класс наследник HttpResponse. А TemplateResponse просто уже включает RequestContext. Проще в исходный код посмотреть…
However, it can sometimes be beneficial to allow decorators or middleware to modify a response after it has been constructed by the view. For example, you may want to change the template that is used, or put additional data into the context.
TemplateResponse provides a way to do just that. Unlike basic HttpResponse objects, TemplateResponse objects retain the details of the template and context that was provided by the view to compute the response. The final output of the response is not computed until it is needed, later in the response process.
Отредактировано buddha (Апрель 17, 2013 23:05:13)
Офлайн
А, да, шорткаты HttpResponse же возвращают в отличие от generic views.
Получается, если не используется TemplateResponse, то для добавления значения во все шаблоны проще использовать context processor.
Офлайн
MikaMikaЕсли блок info1 должен быть заполнен только в inf2 проще просто передавать его в шаблон из inf2.
А мне нужно что бы он (блок “info1”) всегда был заполненный.
…
Я пока нашёл только один выход.
Это сделать одинаковые запросы во второй функции и передать результат в шаблон.
Офлайн
Сделал прослойку:
def return_info1(): return info1 = Info1.objects.get(pk=1)
def inf1(request): return render(request, 'app1_base.html', {'info1': return_info1()} def inf2(request): info2 = Info2.objects.get(pk=1) return render(request, 'app1_base.html', {'info1': return_info1(), 'info2': info2}
Отредактировано MikaMika (Апрель 19, 2013 12:06:44)
Офлайн
А если еще что-то во все шаблоны нужно будет добавить, будете править все view?
myapp/path/to/context_processor.py
def return_info1(request): return {'info1': Info1.objects.get(pk=1)}
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS TEMPLATE_CONTEXT_PROCESSORS += ( 'myapp.path.to.context_processor.return_info1', )
Офлайн