теги пользовательского шаблона django: метод рендеринга не вызывается

#django #django-templates

#django #django-шаблоны

Вопрос:

payment-tags.py

 @register.simple_tag
def has_purchased(user_id):
  payments = Payment.objects.all(user__id=user_id)
  return PaymentObjects(payments)

class PaymentObjects(template.Node):
  def __init__(self, payments):
    print 'inside init'
    self.payments_obj = payments

  def render(self, context):
    print 'inside render'
    context['payments'] = self.payments_obj
    return ''
  

Внутренний html:

 {% load payment-tags %}
{% has_purchased request.user.id %}
  

Метод рендеринга класса PaymentObjects никогда не вызывается, он входит в функцию инициализации, но не внутри рендеринга..

Я искал эту проблему в Google, но не получил удовлетворительного ответа, который мог бы решить проблему.

Любой совет был бы с благодарностью принят, спасибо.

Ответ №1:

register.simple_tag используется для функций тегов, которые немедленно возвращают результат (Django создает узел для вас). Если вы хотите вернуть свой собственный узел, используйте register.tag вместо этого.

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

1. Спасибо за ответ, но в таком случае, как мне отправить параметр, который мне нужно отправить, т.Е. request.user.id так как, когда я меняю его на тег, он выдает ошибку «has_purchased () принимает ровно 1 аргумент (задано 2)»

2. @Neo: Вам нужно проанализировать аргументы самостоятельно. Теги получают два аргумента, parser и token . Прочитайте документы .

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