【问题标题】:django - pass parameter from template to models.py' s functiondjango - 将参数从模板传递到 models.py 的函数
【发布时间】:2013-04-05 14:10:52
【问题描述】:

我有一个名为 mymodel 的模型,它有一个属性 getp,但这需要一个参数(请求):

class Mymodel(models.Model):
    ...
    def getp(self, request):
        return "STH"

。从视图中,我将请求和一个模型传递给模板:

return render_to_response('x.html', {
                                       'mymodel': Mymodel.objects.get(id=17),
                                       'request': request
                                   }, context_instance = RequestContext(request))

,从模板文件中,有没有办法用请求参数调用getp函数?我知道不应该这样使用它,但我的问题是理论上的而不是实际的。

有解决这个问题的办法吗?

谢谢。

【问题讨论】:

    标签: python django templates variables models


    【解决方案1】:

    似乎与 How to use method parameters in a Django template?

    一种解决方案是将方法的结果传递给模板。类似:

    object = Mymodel.objects.get(id=17)
    return render_to_response('x.html', {
        'mymodel': object,
        'mymodel_getp': object.getp(request),
        'request': request
        }, context_instance = RequestContext(request))
    

    其他解决方案是编写自定义模板标签:

    @register.simple_tag(name="model_getp", takes_context=True)
    def model_getp(context, object=None):
        return object.getp(context)
    

    然后在模板中:

    {% model_getp mymodel %}
    

    【讨论】:

    • 谢谢。好吧,第一个解决方案是它应该如何以 django 方式使用,但我对这个解决方案的问题是,如果我想将更多对象传递给模板(Myobject.objects.filter()),我想循环他们。一个明显的解决方案是在结果中使用元组,例如 ((mymodel1, mymodel1_getp), (mymodel2, mymodel2_getp)),但这很难看。
    • 第二种解决方案效果很好,我喜欢它(除了 simple_tag 不接受 name 参数),但是如果我想测试结果的存在怎么办?至少在这种形式下它并没有真正起作用: {% if model_getp mymodel %} 。它在 if 表达式的末尾显示未使用的“mymodel”。
    • 要在 if 语句中使用它,您必须从中创建一个过滤器,计算结果为 bool stackoverflow.com/questions/6047959/… 我不确定如何将上下文传递给过滤器
    • 我c。在第一种情况下,当我从视图返回所需的结果时,解决我的问题的“标准方法”是什么,因为我认为我的元组解决方案非常难看。
    • 但是,如果第二种解决方案可以使用 if 标记,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2020-06-08
    • 1970-01-01
    • 2011-04-18
    • 2011-08-18
    • 2020-05-20
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多