Основная проблема MVT в Джанго - PullRequest
6 голосов
/ 24 апреля 2009

У меня есть веб-сайт Django следующим образом:

  • сайт имеет несколько просмотров
  • каждый просмотр имеет свой собственный шаблон для отображения своих данных
  • каждый шаблон расширяет базовый шаблон
  • базовый шаблон является базой сайта, имеет все JS / CSS и базовый макет

Так что до сих пор все хорошо. Итак, теперь у нас есть главный руководитель сайта (который существует в базовом шаблоне), и он является общим для всех просмотров.

Но теперь я хочу сделать его динамическим и добавить к нему некоторые динамические данные. На каком виде я делаю это? Все мои взгляды в основном render_to_response('viewtemplate.html', someContext). Так как же добавить общий вид к базовому шаблону?

Очевидно, я не буду дублировать общий код для каждого отдельного представления ...

Я думаю, что мне не хватает чего-то фундаментального в основе MVT Django.

Ответы [ 3 ]

7 голосов
/ 24 апреля 2009

Вы хотите использовать context_instance и RequestContext с.

Сначала добавьте вверху вашего views.py:

from django.template import RequestContext

Затем обновите все ваши представления так, чтобы они выглядели так:

def someview(request, ...)
    ...
    return render_to_response('viewtemplate.html', someContext, context_instance=RequestContext(request))

В вашем settings.py добавьте:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    ...
    'myproj.app.context_processors.dynamic',
    'myproj.app.context_processors.sidebar',
    'myproj.app.context_processors.etc',
)

Каждый из этих context_processors является функцией, принимает объект request и возвращает контекст в виде словаря. Просто поместите все функции в context_processors.py внутри соответствующего приложения. Например, блог может иметь боковую панель со списком последних записей и комментариев. context_processors.py будет просто определять:

def sidebar(request):
    recent_entry_list = Entry.objects...
    recent_comment_list = Comment.objects...
    return {'recent_entry_list': recent_entry_list, 'recent_comment_list': recent_comment_list}

Вы можете добавить столько, сколько захотите.

Для более подробной информации, ознакомьтесь с Django Template Docs .

2 голосов
/ 27 апреля 2009

Контекстные процессоры и RequestContext (см. Ответ Тайлера) - это способ получить данные, которые используются при каждой загрузке страницы. Для данных, которые могут вам понадобиться в различных представлениях, но не во всех (особенно данных, которые на самом деле не связаны с основной целью представления, но отображаются в чем-то вроде боковой панели навигации), часто имеет смысл определить собственный шаблон тег для получения данных.

0 голосов
/ 24 апреля 2009

или используйте универсальное представление , поскольку им автоматически передается контекст запроса.

можно использовать простой прямой вид к шаблону, чтобы избежать необходимости импортировать / передавать в контексте запроса.

...