LINUX.ORG.RU

[Django]DRY

 


0

0

предположим у меня есть несколько разных страниц, для каждой свой вид в view.py, но есть нечто (например 5 самых свежих новостей), что мне надо отображать на всех страницах. писать в каждом виде что-то типа news = New.objects.all()[:5] было бы неправильно, тогда выносим в отдельную функцию. но писать в каждом виде что-то типа news=get_news тоже некрасиво. как поступить? оставить как есть или есть что-то, что избавит меня от лишней писанины?

Ответ на: комментарий от anonymous

еще раз спасибо, все сделал через register.inclusion_tag

z0D5e8n7x_2
() автор топика

Прям нашел в старом проекте такую же задачу:

############context_processors.py

def news(request):

    latest_news = NewsItem.objects.all()[:4]
    return {'news' : latest_news}

############views.py
from django.template import RequestContext
...
def page(request, page_url):

    page = get_object_or_404(Page, url=page_url)
    return render_to_response('pages/page.html',
                              {'page' : page}, context_instance=RequestContext(request))

############template

{% for item in news %}
...
<span class="date">{{ item.date|date:"d.m.y" }}</span><span class="head">{{ item.header }}</span>
...
{% endfor %}
anonymous
()
Ответ на: комментарий от anonymous

>context processors.

Зачем повсюду таскать список объектов, которые нужны только в одном месте шаблона? имхо context processors для более глобальных вещей, от которых зависит рендеринг шаблона - user, i18n etc. А если завтра нужно будет еще одну сущность вывести на 3-х страницах, что ее тоже в контекст пихать?

anonymous
()
Ответ на: комментарий от anonymous

>А если завтра нужно будет еще одну сущность вывести на 3-х страницах, что ее тоже в контекст пихать?

На трёх можно и во view сделать. Естественно контекст для глобальных вещей, а топикстартер вроде такого и хотел.

anonymous
()
Ответ на: комментарий от z0D5e8n7x_2

Зачем в проекте на странице /about/ последние пять новостей? Фильтры и теги как раз для того и предназначены, чтобы "дать работу" верстальщикам. При этом они освобождают от излишней перегруженности представления, не загружают контекст и, наконец, гибче.

Сравните с предложенным выше:

{% lastest_news %}

или

{% lastest_news 5 %}

или

{% lastest_news 20 unapproved %}

или

{% lastest_news 3 "sport" %}


Теперь, верстальщик вдруг решил, что на странице /foo/bar/ вообще не нужны последние новости. Сколько строк ему придется закоментировать в обоих случаях? А вдруг в спешке что-то забудет закоментировать?

commit ★★
()
Ответ на: комментарий от commit

Да, но в случае когда требуется выводить на _всех_ страницах, контекст может быть вполне оправдан. Естественно тут надо каждый случай отдельно рассматривать, стоит или не стоит использовать. Всё от задачи зависит.

anonymous
()
Ответ на: комментарий от commit

все, понял спасибо, очень логично и разложено по полочкам ))

z0D5e8n7x_2
() автор топика
17 ноября 2009 г.
Ответ на: комментарий от commit

>Теперь, верстальщик вдруг решил, что на странице /foo/bar/ вообще не нужны последние новости

по-моему это не задача верстальщика решать что нужно, а что не нужно. Задача верстальщика представление делать той инфы, что передал её view.

chicane
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.