#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. Вы столкнетесь с той же проблемой, если попытаетесь загрузить его из шаблона, который был рендерен из представления. Он каким-то образом работает только с включенными и расширенными шаблонами. Я столкнулся с этой проблемой, я загрузил ее из базового шаблона, который позже будет расширен всеми другими шаблонами.