谢谢你的提示,格里。我发现按照您的建议编写自定义模板标签是可行的方法。以下是血淋淋的细节,以防有人偶然发现。
在视图方法中,我发布了一个字典“user_activity_status”,其中包含一个 key 的 activity.id 和 UserActivityWork 对象的值,用于登录用户在该活动上的工作
这是模板的相关部分。基本上这将添加一个变量“map_value”,其值为
getattr(user_activity_status[activity.id], "comment")
这是模板:
{% load *file-name-of-the-templatetag-file* %}
{% access_map_method user_activity_status activity.id comment %}
{% if map_value %}
{{ map_value }}
{% else %}
get working sucka!
{% endif %}
这是模板标签文件的部分(有关如何设置的详细信息,请参阅 Gerry 的链接)
from django import template
register = template.Library()
@register.tag(name="access_map_method")
def do_access_map_method(parser, token):
try:
tag_name, dict_name , key_name, method_name = token.contents.split()
except ValueError:
msg = '%r tag requires three arguments' % token.contents[0]
raise template.TemplateSyntaxError(msg)
return MapNode(dict_name , key_name, method_name)
class MapNode(template.Node):
def __init__(self, dict_name, key_name, method_name):
self.dict_var = template.Variable(dict_name)
self.key_var = template.Variable(key_name)
self.method_name = method_name
def render(self, context):
try:
dict_obj = self.dict_var.resolve(context)
key_obj = self.key_var.resolve(context)
if key_obj in dict_obj.keys():
if self.method_name:
context['map_value'] = getattr(dict_obj[key_obj], self.method_name)
else:
context['map_value'] = dict_obj[key_obj]
else:
context['map_value'] = ''
except template.VariableDoesNotExist:
context['map_value'] = ''
return ''