如果我想在 Django 模板中有条件地使用数据库数据,我需要做啥?

Posted

技术标签:

【中文标题】如果我想在 Django 模板中有条件地使用数据库数据,我需要做啥?【英文标题】:What do I need to do if I want to use database data conditionally in Django templates?如果我想在 Django 模板中有条件地使用数据库数据,我需要做什么? 【发布时间】:2021-12-30 19:22:44 【问题描述】:

我正在 Django 中开发一家电子商务商店。我想知道如何使用 render() 方法,有条件地通过 javascript 或 AJAX 或 JSON 传递给模板的数据库数据?

例如,假设我有一个关注者models.py

from django.db import models

class Suit(models.Model):
    title = models.CharField(max_length = 100, verbose_name = "Title")
    img = models.FileField(upload_to = 'suit-products/', null = True, verbose_name = "Picture")

    def __str__(self):
        return f"self.title"

class Buttoning(models.Model):
    title = models.CharField(max_length = 100, verbose_name = "Title")
    img = models.FileField(upload_to = 'buttonings/', null = True, verbose_name = "Picture")

    def __str__(self):
        return f"self.title"

并关注views.py

from django.shortcuts import render

def index(request):
    suit_prods             = Suit.objects.all()
    buttoning = Buttoning.objects.all()

    context 
        "suit_prods": suit_prods,
        "buttoning": buttoning
    

    return render(request, "index/index.html", context)

并关注index.html(模板):

    % for element in suit_prods %
        <li>
            <a href="#">
                <div id="menu">
                    <img src=" element.img.url " />
                    <span> element.title </span>
                    <span></span>
                </div>
            </a>
        </li>
    % endfor %

现在我想要的是,如果在index.html 的列表项中单击的element 具有title 作为"two_piece_suit" 然后将 buttoning 的项显示为列表,否则通过。

如果我使用一些 JS 语法来解释它,那么我想要以下行为:

<scrip>
    var suit_menu = document.getElementsByClassName("menu");
    for(var i = 0; i < suit_menu.length; i++) 
        if(suit_menu.text == "two_piece_suit") 
            % for element in buttoning %
                <li>
                    <a href="#">
                        <div id="buttoning">
                            <img src=" element.img.url " />
                            <span> element.title </span>
                            <span></span>
                        </div>
                    </a>
                </li>
            % endfor %
        
    
</script>

【问题讨论】:

【参考方案1】:

如果我理解正确,您不一定需要 JavaScript 来实现这一点。此外,&lt;script&gt; 缺少一个 t,并且您的 for 循环似乎根本没有将 HTML 添加到文档中。

您可以完全使用 Django 模板语言通过将按钮 for 循环与 if 条件集成,如下所示:

% if element.title == 'two_piece_suit' %
    % for button in buttoning %
        <Some HTML> button.title </Some HTML>
    % endfor %
% endif %

这样,按钮列表只有在 title 为 two_piece_suit 时才会显示。

【讨论】:

以上是关于如果我想在 Django 模板中有条件地使用数据库数据,我需要做啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中“有条件地”提供静态文件

在 if 条件内调用块:django 模板

如何在 django 模板中从 for 循环中转义一行

在 django admin 中有条件地取消注册或注册模型

将表格数据从模板发送到 django 中的 view.py

使用 django 和图表 js 无法在模板中看到饼图