Странно, даже я сталкивался с этим вопросом.
Хотя позже мне пришлось изменить свой код, я не смог найти его решение. Очевидно, что происходит примерно так:
Все, что вы пишете в шаблонах, разделяется на узлы, переменные и т. Д. Переменные во время рендеринга ищутся в контексте, доступном для этого экземпляра. И, пожалуйста, обратите внимание, что для тегов 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.