如何在Django的下拉列表中列出唯一值?

时间:2014-06-25 21:35:30

标签: django django-templates

仅仅是为了测试,我有一个python,脚本将IP地址输入数据库 我有以下价值观:

127.0.0.1  
127.0.0.1  
10.42.1.42  
10.42.1.42  
10.42.1.42  

型号:

class Invalid(models.Model):
    access = models.DataTimeField()
    ip = models.CharField()
    login = models.CharField()

在模板中,这就是我对下拉列表所拥有的内容:

<p>Choose: 
<select>
{% for item in results %}
    <option value="{{ item.ip }}">{{ item.ip }}</option>
{% endfor %}
</select>
<button type="button">Filter</button>  
</p>  

但是,此方法的问题在于它列出了所有值。据我所知,虽然我可能弄错了,但是没有办法创建数组/列表。

有没有办法只在列表中显示不同的值,即:

127.0.0.1  
10.42.1.42

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

假设结果是一个查询集:

如果你有一个支持(postgres)的后端,你可以在ip字段上使用distinct

results.distinct('ip')


Select DISTINCT individual columns in django?


也许你也可以在python中构建一个独特的集合

uniques_ips = {}
for item in results:
  if item.ip not in unique_ips:
     unique_ips[item.ip] = item

unique_ips.values()

答案 1 :(得分:0)

views.py文件中,您将对查询集进行子集化,以仅获取不同的值。然后,您只需将这些不同的值返回到模板。

因此,使用您的示例,您有一个名为results的上下文对象。您没有定义如何填充该对象,或者您的模型是什么样的,所以为了参数,我们假设您的应用程序采用以下模型:

from django.db import models

class MyModel(models.Model):
    ip = models.IPAddressField()

现在,让我们看看views.py,我们正在使用Generic Class Based Views

from django.views.generic.list import ListView

class IpListView(ListView):
    def get_queryset(self):
        queryset = super(IpListView, self).get_queryset()
        unique_ips = queryset.values('ip').distinct()
        return unique_ips

注意:您还可以将distinct()方法直接放在下面的urls.py查询集对象中...

urls.py中,您需要确保将IpListView发送到模板。类似的东西:

from django.conf.urls import patterns, url
from myapp.models import MyModel
from myapp.views import IpListView

urlpatterns = patterns('',
    url(r'^$',
        IpListView.as_view(
            queryset=MyModel.objects.order_by('ip'),
            context_object_name='results',
            template_name='myapp/mytemplate.html',
        ), name='mymodel-ips'
    )
)

请注意results是您的上下文对象名称。这意味着您的所有ip字段值都将在您的模板mytemplate.html中显示为:

for r in results:
    ip_option = r.ip

由于您已经将查询集的子集只包含唯一的IP,因此您可以获得所需的内容。所以你只需要循环:

<p>Choose: 
    <select>
    {% for item in results %}
        <option value="{{ item.ip }}">{{ item.ip }}</option>
    {% endfor %}
    </select>
    <button type="button">Filter</button>
</p>

这里有一点需要注意:如果您需要模型中的任何其他字段,请不要说明。如果你这样做,我上面列出的查询集将修改你得到的结果,如果你想使用输入的其他值返回,你可能无法得到你期望的结果......