【问题标题】:Django question: how can I get user specific information related to a domain object?Django 问题:如何获取与域对象相关的用户特定信息?
【发布时间】:2010-10-29 11:23:04
【问题描述】:

这是我的模型:

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()

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

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

到目前为止,我已经考虑过:

  • 创建字典 UserActivityWork 带有 Activity id 的键和用户的 UserActivityWork 的值。这会很好 我,但我不知道该怎么做 this 在 django 的模板系统中(即你怎么说:{{ user_work[activity.id] }})
  • 创建一个可以容纳的对象 活动和 用户活动工作。我没有这样做 一,因为我希望 django 有更好的方法来做到这一点。

任何见解将不胜感激!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

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

    在视图方法中,我发布了一个字典“user_activity_status”,其中包含一个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 ''
    

    【讨论】:

      【解决方案2】:

      假设您有 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 %}
      

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-04
        • 2014-05-08
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 2016-03-02
        • 1970-01-01
        相关资源
        最近更新 更多