使用Django的html中的多个下拉菜单过滤器

Posted

技术标签:

【中文标题】使用Django的html中的多个下拉菜单过滤器【英文标题】:Multiple dropdown menu filter in html using Django 【发布时间】:2018-05-11 20:54:29 【问题描述】:

我是 Django 新手,正在尝试创建一个视图,用户可以在其中选择值。有人可以指导如何进行吗?

我已附上模型供您参考,用户应该可以选择BU、团队、级别、产品和渠道的值。此外,在选择 BU 时,团队应该得到更新等等。请提出建议。

class Master_Table(models.Model):
    Key_Variable=models.CharField(max_length=255,primary_key=True)
    BU = models.CharField(max_length=20)
    Team = models.CharField(max_length=20)
    Level = models.CharField(max_length=20)
    Product= models.CharField(max_length=20)
    Channel = models.CharField(max_length=20)

下面是视图

def index(request):
    queryset=Master_Table.obects.all()
    context= "object_list" : queryset 
    return render(request,'compmixapp/index.html',context)

HTML

  <form>
    <input list="BU" name="BU"> <br /> <br>
      <datalist id="BU">
        <option value=% for obj in object_list %
                      obj.BU
                      % endfor %
        >
  </form>

【问题讨论】:

查看datalist html标签 已经做到了。在这种情况下,如何将值从 django 渲染到 html 是问题 将这些值传递到响应的context 变量中,并使用它填充模板 所以我建议查看表单向导。如果下一个选项应该由上一个选择构建,那么该主题可能会变得非常快速非常复杂。制作多个模板并设置您的逻辑。如果您想做得好,请查看 ajax 调用并尝试动态生成下一个字段 @anuj :这就是我尝试做的事情.. def index(request): queryset=Master_Table.obects.all() context= "queryset" : queryset return render(request ,'compmixapp/index.html',context) 所以当我试图将它传递给 html 上下文标签列表时似乎没有工作 【参考方案1】:

你可以在你的 models.py 中设置选项

BU 为例,可用于您的所有属性。

BU_CHOICES = (
    ('val','displayName'),
    ('val2', 'displayName2'),
    ('val3','displayName3'),
)

class Master_Table(models.Model):
    BU = models.CharField(choices=BU_CHOICES, default='val')

希望这会有所帮助!

【讨论】:

是的,但是如何动态过滤 Team 的值?另外,我无法将它们呈现为 html 视图 @deepak 在这种情况下,我建议您阅读一些 django 教程,并阅读文档。我必须给你写完整的解决方案才能解释什么和在哪里,对不起,但我没有时间。希望有帮助! 您有什么想要推荐的链接吗? @deepak Tango with Django 是一个不错的免费教程,其中包含大部分核心内容,将帮助您更好地了解什么在哪里,以及如何自己解决问题。它适用于 1.9/1.10,但示例和教程应该适用于 1.11。下载位于左侧(阅读免费示例)。希望这会有所帮助! 谢谢。我会通过它。我认为您在上面提出的建议,当我尝试这样做时,我不能按照我建议的那样做过滤器。我认为它还会获取所有值,所以看来我必须即时计算 nex 变量。【参考方案2】:

您缺少引号,并且您定义 for loop 的方式在语义上是错误的。

将您的 HTML 更改为以下

<form>
    <input list="BU" name="BU"><br/><br>
        <datalist id="BU">
        % for obj in object_list %
        <option value="obj.BU">
        % endfor %
</form>

导致选项仅显示一个值的问题是以下部分,这在语法上是正确的,但在语义上是错误的,产生的结果与您预期的不同。

 <option value=% for obj in object_list %
                  obj.BU
                  % endfor %
    >

这里发生的事情是,datalist 只获得一个值,即传递给它的查询列表中的所有值。

为了进一步阐述,假设Master_Table 的查询集返回a, b, c, d 对象。所以你写的循环会生成下面的 HTML

<form>
    <input list="BU" name="BU"><br/><br>
        <datalist id="BU">
            <option value=a.BU b.BU c.BU d.BU>
</form>

【讨论】:

谢谢你,它成功了。可以指导我进行动态过滤吗?因此,一旦我选择了 BU,就应该只报告该 BU 下的团队,依此类推…… 您可能需要在视图中进行一些查询才能实现它。解决您对 cme​​ts 的疑虑非常困难,例如@N。 Ivanov 建议,如果您阅读一些教程,最好是视频教程,会更好。只需浏览 youtube 或 google 教程即可。

以上是关于使用Django的html中的多个下拉菜单过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Django admin 中的自定义相关下拉菜单

当多个输入可以为空时,在 Django 中使用 Q 进行过滤

如何根据 Django 下拉菜单中的选择显示和隐藏表单字段

根据 DJango/Ajax 中的第一个选定下拉菜单创建下拉选择

如何根据我在多个下拉列表中选择的内容创建过滤器?

Rails 4 / JS / HTML 无法添加下拉菜单,因此它为 html 表创建过滤器