Предположим, что это то, что мы хотим на каждой странице, мы бы создали "base_template.html"
<title>{% block title %}{{ page_title }}{% endblock %}</title>
<a href="http://{{domain}}{{current_path}}">{{ page_title }}</a>{% endblock %}
Вместо передачи page_title, domain, current_path из каждой функции просмотра, например:
def display_meta(request):
user_meta = request.META.items()
sorted_meta = sorted(user_meta) # a list of tuples
return render_to_response('meta.html', {'sorted_meta': sorted_meta,
'current_path': request.get_full_path(),
'domain': request.get_host(),
'page_title': display_meta.__name__})
# and repeat the dictionary same manner for other views....
#urls.py
('^book_list/$', 'object_get_list', {'model': models.Book}),
Другой подход - упаковка функций просмотра
# urls.py
('^book_list/$', views.get_template(views.object_get_list),{'model': models.Book}),
# views.py
def get_template(view, **extrakw):
def wrapview(request, **extrakw):
template_dict = {'current_path': request.get_full_path(), 'domain': request.get_host()}
extrakw['template_dict'] = template_dict
return view(request, **extrakw)
return wrapview
def object_get_list(request, **kwargs):
model = kwargs.pop('model', None)
model_name = model.__name__.lower()
template_dict = kwargs.pop('template_dict', None)
template_dict[model_name] = model.objects.all()
template_dict['page_title'] = model_name +" list"
template_name = '%s.html' %(model_name)
return render_to_response(template_name, template_dict)
Pro: Помимо редактирования htmls, теперь изменение выполняется только в одном представлении, а не в каждом представлении.
Минусы: Уродливый URLConf и, вероятно, ошибка propne тоже
Попытка 3:
Создайте глобальный словарь так же, как я создал template_dict.
template_dict = {/..../}
def view1()
def view2() ...
Проблема: я не могу использовать request.path (или что-то связано с запросом). Это возвращается к предыдущей попытке (оболочка).
Но должен быть более легкий путь. Как правильно передавать глобальные переменные шаблона по всему сайту django, чтобы каждая функция представления теперь не зависела от глобальных переменных templat?
Спасибо, что уделили время.