1

这是我的模型:

class Activity(models.Model):
    title = models.CharField(blank=False, max_length=100)
    description = models.TextField(blank=False)


class UserActivityWork(models.Model):
    activity = models.ForeignKey(Activity)
    user  = models.ForeignKey(User)
    hours_worked = models.FloatField()
    comment = models.TextField()

示例数据是“攀登珠穆朗玛峰”的活动,每个用户都可以输入他们花了多长时间和评论。

这是我的问题:如何显示所有活动的列表,如果用户已为该活动输入数据,则在活动旁边显示相关详细信息?

到目前为止,我考虑过:

  • 使用 Activity id 的键和用户的 UserActivityWork 的值创建 UserActivityWork 的字典。这对我来说很好,但我不知道如何在 django 的模板系统中执行此操作(即,你怎么说:{{ user_work[activity.id] }})
  • 创建一个同时包含 Activity 和 UserActivityWork 的对象。我没有做过这个,因为我希望 django 有更好的方法来做到这一点。

任何见解将不胜感激!

4

2 回答 2

1

假设您有 2 个可从模板中访问的查询集(例如活动和 user_activities)

一种天真的方法是遍历每个活动,然后遍历每个用户活动。

{% for activity in activities %}
    {{ activity.title }} 
    {% for user_activity in user_activities %}
        {% ifequal user_activity.activity activity %}
            Display userdata
        {% endifequal %}    
    {% endfor %}
{% endfor %}

可以使用点 (.) 在模板中执行字典查找

从技术上讲,当模板系统遇到点时,它会按以下顺序尝试以下查找:

  • 字典查找
  • 属性查找
  • 方法调用
  • 列表索引查找

另一种选择是创建自定义模板标签。您可以像以前一样遍历活动列表,然后将活动和 user_activity 列表或用户传递给标签以执行查找并呈现所需的数据。

于 2009-05-28T05:50:59.987 回答
0

谢谢你的提示,格里。我发现按照您的建议编写自定义模板标签是可行的方法。以下是血淋淋的细节,以防有人偶然发现。

在视图方法中,我发布了一个字典“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 ''
于 2009-05-29T01:41:20.207 回答