仅仅是为了测试,我有一个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
感谢您的帮助。
答案 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>
这里有一点需要注意:如果您需要模型中的任何其他字段,请不要说明。如果你这样做,我上面列出的查询集将修改你得到的结果,如果你想使用输入的其他值返回,你可能无法得到你期望的结果......