如何使用 django 模板以特定顺序呈现 django 模型实例?

Posted

技术标签:

【中文标题】如何使用 django 模板以特定顺序呈现 django 模型实例?【英文标题】:How to render django model instances in particular order using django templates? 【发布时间】:2021-10-14 06:53:56 【问题描述】:

我在我的 html 中有一个 div,每个 id 都是这样的:

<div class="row">
  <div class="myclass" id="id1"></div>
  <div class="myclass" id="id2"></div>
  <div class="myclass" id="id3"></div>
  <div class="myclass" id="id4"></div>
</div>

现在如何按下面指定的顺序渲染模型实例?

行的第一个 div 中的第一个实例

行的第二个 div 中的第二个实例

行的第三个 div 中的第三个实例

行的第四个 div 中的第四个实例

第五个实例在该行的第一个 div 中,依此类推。

任何帮助都将不胜感激,即使它使用的是 javascript 希望它会更简单。

【问题讨论】:

那么你究竟传递给模板的是什么。可以分享一下相关观点吗? 我通过 model.objects.all () 将模型的所有实例传递给它,并将其传递给上下文以便将其访问到模板中 【参考方案1】:

在视图中,您可以使用以下方法“准备”数据:

def my_view(request):
    d = 4  # items per row
    items = list(MyModel.objects.all())
    items = [items[i:i+d] for i in range(0, len(items), d)]
    return render(request, 'name-of-template.html', 'items': items)

然后我们可以枚举子列表,并且对于每个子列表,可以枚举该子列表中的项目,所以:

% for sublist in items %
    <div class="row">
    % for item in sublist %
        <div class="myclass"> item </div>
    % endfor %
    </div>
% endfor %

这里的queryset 是您传递给模板渲染引擎的model.objects.all()

【讨论】:

我确实枚举了这些项目,但它呈现的 div 数量等于模型实例数的 len @PapisDiallo:你应该在视图中切片,所以视图看起来像queryset = MyModel.objects.all()[:5] 那么我将无法渲染模型的所有实例,这就是我想要的。也许问题不是很清楚。在第一个 div 中我想要第一个、第五个、第九个实例,在第二个中我想要第二个、第六个、第十个项目,依此类推 @PapisDiallo:所以你想使用包含五个元素的行? 不只是四个,但应该像我在问题中所说的那样显示元素。第一个 div 中的数据库中的第一个元素,第二个 div 中的第二个元素 第三个 div 中的第三个元素第四个 div 中的第四个元素 现在第五个元素应该转到第一个 div 和第六个第二个 div 和所有其他元素将遵循这个逻辑【参考方案2】:

在您的 html 文件中:

<!-- some code -->

<div class="row">
    % for div_id in range(4) %
    <div class="myclass" id="id div_id + 1 ">
        % for instance in chosenInstances(instances, div_id + 1) %
         instance 
        % endfor %
    </div>
    % endfor %
</div>

<!-- some code -->

在python中:

def chosenInstances(instances, div_id):
    return [instance for index, instance in enumerate(instances) if (index % 4 + 1) == div_id]

render_template("htmlfile.html", chosenInstances=chosenInstances)

【讨论】:

你的回答是正确的。但问题是 django 模板不接受带参数的传递函数,而且这个函数不仅包含参数,而且第二个也是动态的。我正在考虑使用过滤器,但我根本不会动态。 我将 Django 与 Jinja2 不匹配 ?‍♂️ 我仍在尝试通过结合 2 个答案来修复。

以上是关于如何使用 django 模板以特定顺序呈现 django 模型实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何从视图中呈现特定的 Django 管理页面?

如何在 django 模板中呈现有序字典?

如何将 django 模板变量呈现为 html?

Django如何在查询集中标记用户特定的对象以发送到模板?

django - 如何使翻译工作?

在不同的占位符/模板上以不同的方式呈现 Django-CMS 插件