使用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 下的团队,依此类推…… 您可能需要在视图中进行一些查询才能实现它。解决您对 cmets 的疑虑非常困难,例如@N。 Ivanov 建议,如果您阅读一些教程,最好是视频教程,会更好。只需浏览 youtube 或 google 教程即可。以上是关于使用Django的html中的多个下拉菜单过滤器的主要内容,如果未能解决你的问题,请参考以下文章
当多个输入可以为空时,在 Django 中使用 Q 进行过滤