【问题标题】:grab the first item in an object array in DJango Templates在 DJango 模板中获取对象数组中的第一项
【发布时间】:2017-12-05 01:39:21
【问题描述】:

我有一个 django 模板,它有两个不同的查询集传递给 html 模板。我想遍历查询集中的每个项目并显示内容,然后我想在仍处于初始循环中时遍历第二个数组并检查两个信息是否匹配。如果两个信息之间存在匹配,我只想从匹配信息中获取第一个结果。

我有一个获取组项目列表的查询。我有另一个获取活动列表的查询。我想通过外键获取与组相关的所有活动对象,并引用活动对象中的组。从该组的相关活动列表中,我想抓取第一条记录并仅显示该记录...如果一个组 (a) 有 10 个与该组相关的活动,我想抓取第一个并显示它。 .. 这是我的代码:

html模板:

    <div class="col-12 info-div">
      {% for group in groups %}
        <div class="row">
          <p class="col-12">
            <a href="{% url 'group_home' group.group.name|slugify group.group.id %}">{{ group.group.name }}</a>
          </p>
          {% for act in activities %}
            {% if act.group.id == group.id %}
            <p class="col-12">
              {{  act.description | first  }}
            </p>
            {% endif %}
          {% endfor %}
        </div>
      {% endfor %}
    </div>

上面的 html 只是给了我每个相关活动的第一个字母,而我想要的是第一个项目,其中活动中的组与正在循环的组匹配

views.py 文件:

# grab all of the groups you are a member of
groups = Member.objects.filter(user = user).all()
# the following will be the last activity created for each group
activities = GroupActivity.objects.all()

models.py

class Group(models.Model):
    name = models.CharField(max_length = 25)
    description = models.CharField(max_length = 250, null=True)
    created_by = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
class GroupActivity(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    expense = models.ForeignKey(Expense, null=True, on_delete=models.CASCADE)
    bundle = models.ForeignKey(Bundle, on_delete=models.CASCADE, null=True)
    description = models.CharField(max_length=200, default='some action')
    host = models.CharField(max_length=100, null=True)
    reference = models.IntegerField(default=0)
    category = models.SmallIntegerField(default = 1)
    # 1 - general
    # 2 - specific
    # 3 - no validation
    # 4 - validation
    created = models.DateTimeField(auto_now_add=True)

【问题讨论】:

  • 一定要用模板吗?这可以在视图中与更多内置的 python 功能进行比较

标签: django django-models django-templates django-views


【解决方案1】:

更好的答案:

{% for group in groups %}
    <div class="row">
      <p class="col-12">
        <a href="{% url 'group_home' group.group.name|slugify group.group.id %}">{{ group.group.name }}</a>
      </p>
      {% with group.groupactivity_set.all|first as act %}
        {% if act %}
        <p class="col-12">
          {{  act.description }}
        </p>
        {% endif %}
      {% endwith %}
    </div>
  {% endfor %}

这里我们在模板中做所有事情,就这么简单。

【讨论】:

  • 这将返回单个对象或对象列表。因为如果我有 5 个组,我想要 5 个组和 5 个第一个活动项目。
  • 它返回一个活动对象列表,每个组的第一个。如果您还想要组对象,请将其包含在列表理解中
  • 更新了答案。
  • 它工作了我必须使用以下声明 {% with activities.all|first as act %}... 然后它工作了谢谢。
  • 很高兴它有帮助。
猜你喜欢
  • 2017-06-27
  • 2018-06-06
  • 2013-06-08
  • 2011-04-01
  • 1970-01-01
  • 2019-06-29
  • 2013-08-04
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多