将参数传递给Django模板中的模型方法

ezd*_*kie 16 django

我正在尝试从指定的业务中获取所有客户,但在Customer模型中有一个类方法来获取基于相同业务的一些信息...让我用代码解释一下......

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

class Customer(models.Model):
    ...
    def get_something(self, obj_business)
        ...
Run Code Online (Sandbox Code Playgroud)

好的,现在在我的观点中,我从这样的指定业务中获得所有客户:

obj_customers = obj_business.customers.all()
Run Code Online (Sandbox Code Playgroud)

然后我尝试在我的模板中打印它:

{% for obj_customer in obj_customers %}
    {{ obj_customer.get_something ....... }}
Run Code Online (Sandbox Code Playgroud)

但是,是的,没有办法传递论据......我想知道是否有一些我遗漏的东西......

我想知道是否有另一个解决方案而不是创建模板标签...因为它是一个ManyToManyField,如果customers字段只是ForeignKey,则不需要将参数传递给该方法......

cat*_*ran 24

您可以创建一个简单的模板标记来调用任何带有任何参数的方法:

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)
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

{% call_method obj_customer 'get_something' obj_business %}
Run Code Online (Sandbox Code Playgroud)

但是,当然,专门模板标签的装箱更安全:-)

@register.simple_tag
def get_something(customer, business):
    return customer.get_something(business)
Run Code Online (Sandbox Code Playgroud)

模板:

{% get_something obj_customer obj_business %}
Run Code Online (Sandbox Code Playgroud)

  • 我们可以使用“with”保存call_method的结果吗? (3认同)

Mik*_*maa 4

您无法将参数传递给 Django 模板中的函数。

相反,您可以编写自己的模板标记

这里有些例子:

https://github.com/miohtama/LibertyMusicStore/blob/master/tatianastore/templatetags/content.py