【问题标题】:Group query results in Django templateDjango模板中的分组查询结果
【发布时间】:2019-07-06 15:52:58
【问题描述】:

我正在尝试对 Django 模板中的查询结果进行分组。我试过regroup 没有成功。

我有一个标签模型,它有一个如下所示的父标签,它与我的 Board 模型相关,它也在下面:

class BoardTags(models.Model):
    name = models.CharField(max_length=150, null=True)
    description = models.TextField(default='', null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    parent_tag = models.ForeignKey('self', null=True, blank=True)

    def __str__(self):
        return self.name

class Board(models.Model):
    title = models.CharField(max_length=100, unique=False, blank=False, verbose_name=('Board_Title'))
    sub_title = models.CharField(max_length=100, blank=False)
    board_description = models.TextField(max_length=300, blank=False)
    tags = models.ManyToManyField(BoardTags, blank=True, related_name='board')

这是我用来创建板的视图(它应该显示板标签):

class CreateBoard(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    model = models.Board
    template_name = 'board/board_form.html'
    select_related = ("user")
    form_class = BoardForm

我正在使用这个小部件 'tags':forms.CheckboxSelectMultiple() 来尝试得到这个结果:

父标签将是“主题”,在导航选项卡内,我希望拥有共享该父标签的各种标签的复选框。

关于如何做到这一点的任何想法?

编辑: 我想我误解了 regroup 也许因为我无法让它作为一个常规列表工作。这是我尝试过的:

{% regroup form.tags by form.parent_tag as tags_list %}

<ul>
{% for parent_tag in tags_list %}
    <li>{{ parent_tag.grouper }}
    <ul>
        {% for tag in parent_tag.list %}
            <li>{{ tag.name }}: {{ tag.description }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

【问题讨论】:

  • regroup 应该可以正常工作。请发布您尝试过的代码。关于regroup,要记住的一件事是它需要接收按您要分组的属性预先排序的数据(这里:parent_tag 的文本值),否则您会得到重复的父标签。
  • @EndreBoth 谢谢。你能告诉我上面的例子哪里出错了吗?

标签: django django-templates


【解决方案1】:

您仍然没有显示将数据发送到模板的视图。你的 for 循环看起来不错,但你 regroup 应该看起来像这样:

{% regroup form.tags by parent_tag as tags_list %}

为此,form.tags 集合中的各个对象需要具有 parent_tag 属性或属性。

如评论中所述,form.tags 中的对象需要已经按parent_tag 排序才能正常工作,否则每个parent_tag 将获得多个组。

【讨论】:

  • 干杯。也许我的一些标签没有 parent_tags,所以我要检查它们并再试一次
  • 您不需要在所有对象上都有parent_tag,如果我不清楚,抱歉。如果有一些没有,那么你会得到一个“无”组,但分组过程仍然有效。如果没有,问题就出在其他地方。
  • 在尝试regroup之前,也许您应该简单地输出未分组的列表以确认对象结构是您认为的方式。
  • 我认为你是对的,问题可能不在于重组。我认为这是因为我正在使用“form.tags”访问标签。这不会让我访问模型的任何其他部分 - 例如当我尝试 - {% for tagging in form.tags %} #{{tagging.tag}} - {{tagging.choice_label}} - {{tagging.description}} - 标签的描述没有出现,但标签(作为复选框)出现,choice_label(作为标签的名称)也出现。有什么线索吗?
  • 事实证明,实际上没有简单的方法可以做到这一点。这里的这个小伙子 (stackoverflow.com/questions/39257050/…) 有一个解决方案来覆盖一些默认值。我要试一试。都一样感谢@Endre
猜你喜欢
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多