Передача аргументов методам модели в шаблонах Django

Я пытаюсь получить всех клиентов из определенного бизнеса, но есть метод класса в модели Customer, чтобы получить некоторую информацию на основе того же бизнеса... Позвольте мне объяснить это с помощью кода...

class Business(models.Model):
    ...
    customers = models.ManyToManyField(Customer, blank=True, null=True)

class Customer(models.Model):
    ...
    def get_something(self, obj_business)
        ...

Хорошо теперь в моих представлениях я получаю всех клиентов из указанного бизнеса следующим образом:

obj_customers = obj_business.customers.all()

Затем я пытаюсь напечатать это в своем шаблоне:

{% for obj_customer in obj_customers %}
    {{ obj_customer.get_something ....... }}

Но да, нет способа передать аргументы... Я хотел бы знать, есть ли что-то, что мне не хватает...

Интересно, есть ли другое решение вместо создания тега шаблона... потому что это ManyToManyField, если поле customers было просто ForeignKey, не нужно передавать аргумент этому методу..

Ответ 1

Вы можете создать простой тег шаблона для вызова любого метода с любыми аргументами:

from django import template

register = template.Library()

@register.simple_tag
def call_method(obj, method_name, *args):
    method = getattr(obj, method_name)
    return method(*args)

И затем в вашем шаблоне:

{% call_method obj_customer 'get_something' obj_business %}

Но, конечно, ярлык специализированного тега шаблона более безопасен: -)

@register.simple_tag
def get_something(customer, business):
    return customer.get_something(business)

Шаблон:

{% get_something obj_customer obj_business %}