Как передать имя функции шаблону в extra_context

#django

#django

Вопрос:

Как мне передать функцию шаблону в extra_context. Спасибо.

Обновление: Идея в том, что в шаблоне я мог бы развернуться и передать эту функцию в качестве параметра фильтру.

Ответ №1:

Есть ли причина, по которой вы не можете просто передать ссылку на функцию?

 def my_func():
    # ...

urlpatterns = patterns('',
    (r'^foo/$', direct_to_template, {
        'template': 'foo.html', 
        'filter_func': my_func,
    }),
)
  

Редактировать: Rats, это не будет работать с общими представлениями:

Если значение в словаре можно вызвать, общее представление вызовет его непосредственно перед отображением шаблона.

Вероятно, вы могли бы обойти это, поместив свою функцию в словарь, хотя это не очень красиво:

 def my_func():
    # ...

urlpatterns = patterns('',
    (r'^foo/$', direct_to_template, {
        'template': 'foo.html', 
        'filter_funcs': { 'my_func': my_func },
    }),
)
  

Я должен сказать, что почти каждый раз, когда я начинаю пытаться заставить общие представления выполнять что-то немного необычное, я, как правило, трачу изрядное количество времени, прежде чем просто написать четырехстрочное пользовательское представление, которое делает то, что мне нужно.

Комментарии:

1. Если я попробую extra_context={‘f’: f2}, он возвращает ошибку «f2 () принимает ровно 1 аргумент (задано 0)», как будто он думал, что я вызываю его там.

2. да. f2 — это функция. Я установил extra_context ={‘f’: f2}, и он возвращает это сообщение об ошибке, как будто он думал, что я пытаюсь вызвать f2 вместо ссылки на него. Вы уверены, что в вашем примере это не просто вызов my_func, учитывая, что он не принимает параметры.

3. Смотрите мою правку — очевидно, общие представления вызывают функции в extra_context перед рендерингом шаблона.