Проблема с перегруппировкой Django - PullRequest
0 голосов
/ 29 августа 2009

У меня есть пользовательский фильтр user_tz, который принимает пользователя в качестве аргумента. Он отлично работает везде, но когда я попытался использовать этот фильтр в теге regroup, он не может сказать, что пользователь не существует.

код:

{% regroup proj_messages.object_list от созданного_пользователя | user_tz: пользователь как proj_message_list%}

Это ошибка, которую я получаю: При рендеринге произошло исключение: не удалось найти ключ [user] в u «Задачи на сегодня».

Спасибо, Масуд Ахмед

1 Ответ

0 голосов
/ 29 августа 2009

Странно, даже я сталкивался с этим вопросом. Хотя позже мне пришлось изменить свой код, я не смог найти его решение. Очевидно, что происходит примерно так:

Все, что вы пишете в шаблонах, разделяется на узлы, переменные и т. Д. Переменные во время рендеринга ищутся в контексте, доступном для этого экземпляра. И, пожалуйста, обратите внимание, что для тегов regroup доступный контекст является именно тем object_list, который вы передали в качестве первого аргумента. Не обычный контекст (который содержит 'user' в вашем случае), который является глобальным для всего шаблона. Таким образом, он не может найти любую другую указанную вами переменную, которой нет у вас object_list.

Таким образом, в вашем случае контекст, доступный для перегруппировки, - это объект из proj_messages.object_list. И поэтому код распознавателя может найти переменную created_on в контексте, но не user. И это то, что вызывает исключение шаблона здесь.

Учитывая это, представьте, что произойдет, если у вашего object_list тоже будет атрибут user. В этом случае не будет никакого KeyError, , но user, переданного в фильтр, будет совсем не той переменной user, которую вы намеревались передать.

Редактировать по запросу: Нет прямого способа передать user на такое использование фильтра в теге regroup. Но вид взлома, очевидно, сработает. Обратите внимание, это просто взломать. Сделайте так, чтобы каждая отдельная сущность / объект proj_messages.object_list содержала эту пользовательскую переменную из представления или используя дополнительный фильтр для object_list из шаблона. Но, что еще лучше, если вы хотите, чтобы user был доступен везде, вне контекста, я хотел бы, чтобы вы рассмотрели еще один хак. Выезд, http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...