django - 将参数从模板传递到 models.py 的函数

Posted

技术标签:

【中文标题】django - 将参数从模板传递到 models.py 的函数【英文标题】:django - pass parameter from template to models.py' s function 【发布时间】: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函数?我知道不应该这样使用它,但我的问题是理论上的而不是实际的。

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

谢谢。

【问题讨论】:

【参考方案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 ***.com/questions/6047959/… 我不确定如何将上下文传递给过滤器 我c。在第一种情况下,当我从视图返回所需的结果时,解决我的问题的“标准方法”是什么,因为我认为我的元组解决方案非常难看。 但是,如果第二种解决方案可以使用 if 标记,那就太好了。

以上是关于django - 将参数从模板传递到 models.py 的函数的主要内容,如果未能解决你的问题,请参考以下文章

Django - 将变量从函数视图传递到 html 模板

NoReverseMatch:无法将参数从模板传递到视图。

将 DJango 模板变量作为输入参数传递

Django如何将数据从视图发送到模板

将值从 fullCalendar 单击传递到 Django 模板

Django,如何将变量从 Django 管理员传递到模板?