在Django模板中调用方法

时间:2014-03-04 16:05:25

标签: django django-templates

我的观点为我提供了一个列表或报告以及当前用户

在我的模板中,我想这样做:

{% for report in reports %}
    ...
    {% if current_user.can_edit_report(report) == True %}
       ...
    {% endif %}
    ...
{% endfor %}

但是这会引发错误

Could not parse the remainder: '(report)' from 'current_user.can_edit_report(report)'

因为Django似乎无法在模板中调用带参数的方法。

所以我必须在View ...

中这样做

你知道如何正确地做到这一点吗?

由于

1 个答案:

答案 0 :(得分:1)

是的,如上所述,此问题有重复项(How to call function that takes an argument in a Django template?)。

您要做的是创建自定义模板标记(https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-tags),如此...

# template
<p>Can Edit: {% can_edit_report user_id report_id %}.</p>

# template_tags.py
from django import template

def can_edit_report(parser, token):
    try:
        # tag_name is 'can_edit_report'
        tag_name, user_id, report_id = token.split_contents()
        # business logic here (can user edit this report?)
        user = User.objects.get(pk=user_id)
        report = Report.objects.get(pk=report_id)
        can_edit = user.can_edit_report(report)
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires two arguments" % token.contents.split()[0])
    return can_edit