Ошибка «Неверный фильтр» для моих пользовательских фильтров шаблонов Django, но не для других фильтров - PullRequest
1 голос
/ 11 декабря 2010

В моем проекте Django есть файл python, который содержит пользовательский тег шаблона и пользовательский фильтр шаблона.

Мой пользовательский тег использует template.loader.get_template() для загрузки другого файла шаблона. Это прекрасно работало ... пока я не добавил свой собственный фильтр в загруженный шаблон.

Теперь я получаю исключение Django "Invalid Filter" TemplateSyntaxError. Глядя на стек вызовов, Django не может загрузить мой шаблонный фильтр.

Здесь все становится странно. Я могу использовать свои собственные фильтры из другого шаблона. Я могу использовать любой другой фильтр внутри шаблона, загруженного моим собственным тегом. Но я не могу использовать свой собственный фильтр внутри своего собственного тега.

Очевидная причина этого - не загрузка файла моего пользовательского тега / фильтра в шаблон HTML, но я его правильно загружаю. (потому что, когда я не загружаю его, я получаю другую ошибку - «недопустимый тег блока»)

Я использую Django 1.2.3 на Python 2.7.

[Кстати, я наконец-то нашел ответ сам, но это заняло у меня несколько часов, и я нигде не смог найти ответ в stackoverflow или в Google, поэтому я собираюсь ответить на свой вопрос, чтобы другие не придется тратить столько времени, как я]

1 Ответ

7 голосов
/ 11 декабря 2010

Ответ безумно прост: разделите пользовательский тег и пользовательский фильтр на два отдельных файла Python, и он будет работать.

Я подозреваю, что проблема заключается в следующем: пользовательский тег использует template.loader.get_template() для загрузки другого шаблона. Этот файл шаблона содержит тег {% load %}, который пытается загрузить тот же файл, в котором определен родительский пользовательский тег. По какой-то причине это не работает - возможно, потому что это вызвало бы бесконечный цикл или потому что Django предполагает, что оно уже загружено.

Я не пытался повторно загружать пользовательский тег внутри фильтра или тег внутри другого тега, чтобы увидеть, возникает ли там такая же проблема, но если это произойдет, исправление будет таким же: если вы хотите используйте template.loader.get_template() для загрузки шаблона, содержащего вызовы к вашим собственным пользовательским тегам или фильтрам, убедитесь, что файл, вызывающий template.loader.get_template(), отличается от файла, определяющего ваши включенные теги / файлеры.

...