我的观点为我提供了一个列表或报告以及当前用户
在我的模板中,我想这样做:
{% 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 ...
中这样做你知道如何正确地做到这一点吗?
由于
答案 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