【问题标题】:Passing arguments to model methods in Django templates将参数传递给 Django 模板中的模型方法
【发布时间】:2015-02-14 07:34:36
【问题描述】:

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

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,则无需将参数传递给该方法.. .

【问题讨论】:

    标签: django


    【解决方案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 %}
    

    【讨论】:

    【解决方案2】:

    您不能将参数传递给 Django 模板中的函数。

    相反,您可以编写自己的template tag。

    这里有一些例子:

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2010-12-26
      • 2010-11-27
      • 2019-08-30
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多