Взаимодействие с пользовательскими тегами Django - PullRequest
0 голосов
/ 01 ноября 2011

Я определил один пользовательский тег {% get_user user_id %}, который перехватывает идентификатор пользователя и возвращает объект пользователя через переменную user_obj: {{ user_obj.email }}, {{ user_obj.name }}, {{ user_obj.photo.url }} и т. Д.

И все работает нормально.Затем я определил тег {% get_user_items user %}, который получает объект пользователя и возвращает URL-адрес фотографии пользователя через переменную user_photo: {{ user_photo }}.

Я хочу установить взаимодействие между этими двумя пользовательскими тегами.Это означает что-то вроде этого:

{% load user_tags %}
{% get_user 1 %}
{{ user_obj }} // returns unicode string as expected
{% get_user_items user_obj %}
{{ user_photo }}

Как я понимаю, тег 'get_user_items' должен получить объект пользователя через переменную user_obj, , но нет - он получает из переменной user_obj обычную строку 'user_obj', а необъект !!!

Как это исправить?Что я делаю неправильно???Как передать значение из переменной {{ user_obj }} в тег {% get_user_items %} напрямую?

Спасибо за ваши ответы заранее !!!

1 Ответ

2 голосов
/ 01 ноября 2011

Вы должны разрешить строку как переменную, используя контекст. См. Обсуждение передачи переменных шаблона в теги в документации Django

class FormatTimeNode(template.Node):
    def __init__(self, date_to_be_formatted, format_string):
        self.date_to_be_formatted = template.Variable(date_to_be_formatted)
        self.format_string = format_string

    def render(self, context):
        try:
            actual_date = self.date_to_be_formatted.resolve(context)
            return actual_date.strftime(self.format_string)
        except template.VariableDoesNotExist:
            return ''

Это пример из документации. Сначала вы должны пометить значение как переменную, используя template.Variable. Аргумент для этого является аргументом, который содержит имя переменной. В примере это date_to_be_formatted. Это сохраняется как переменная экземпляра на узле, поэтому она доступна позже в методе render.

Затем в методе рендеринга вы пытаетесь разрешить переменную из контекста (render имеет доступ к контексту, поэтому он здесь и делается). Это можно сделать, вызвав resolve для переменной экземпляра, которую вы создали в методе __init__, и передав ей контекст в качестве аргумента. Возможно, переменная не может быть разрешена, поэтому она должна находиться в блоке try...except.

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