【问题标题】:Multiple dropdown menu filter in html using Django使用Django的html中的多个下拉菜单过滤器
【发布时间】: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 上下文标签列表时似乎没有工作

标签: django django-templates django-rest-framework


【解决方案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 教程即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2020-10-01
  • 2017-02-14
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多