Как правильно передать глобальные переменные шаблона в Django? - PullRequest
2 голосов
/ 06 января 2012

Предположим, что это то, что мы хотим на каждой странице, мы бы создали "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?

Спасибо, что уделили время.

1 Ответ

6 голосов
/ 06 января 2012

Используйте процессор контекста.

Добавьте имя вашей функции в TEMPLATE_CONTEXT_PROCESSORS in settings.py.

Простой процессор контекста, который я использую:

def common_request_parameters(request):
    return {'home_login_form': AuthenticationForm(request)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...