【问题标题】:How to render django model instances in particular order using django templates?如何使用 django 模板以特定顺序呈现 django 模型实例?
【发布时间】: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 () 将模型的所有实例传递给它,并将其传递给上下文以便将其访问到模板中

标签: javascript python django django-templates


【解决方案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 个答案来修复。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2016-02-19
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多