2014-06-25 31 views
0

只是为了测试,我有一个Python脚本,输入IP地址到数据库中。
我有以下值:如何在Django的下拉列表中列出唯一值?

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

你真的没有提供足够的细节你正在努力做什么才能给出明确的答案。你的模型(和数据库表)对于IP来说是什么样的? – tatlar

+0

对不起,我应该指定。我的模型的名称是无效的,字段为:“访问”(DateTimeField),“IP”(CharField),“登录”(CharField)。 – gjvatsalya

+0

看看Django [模型参考](https://docs.djangoproject.com/en/dev/ref/models/fields/)和我的答案,下面列出了使用哪些字段类型。你至少应该为'ip'字段使用'IPAddressField()'。我编辑了你的帖子来反映这一点。它需要得到主持人的批准才能出现。 – tatlar

回答

0

假设结果是一个QuerySet:

如果您有支持(Postgres的)后端它,你可以在ip

results.distinct('ip')


Select DISTINCT individual columns in django?


使用 distinct

也许你也可以在python

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

unique_ips.values() 
+0

对不起,我是Django的新手。我将如何访问存储在python列表中的值。我应该为独特的IP创建一个新表吗? – gjvatsalya

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下面QuerySet对象...

在你的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> 

一个告诫在这里:你不明确,如果你需要从你的模型的任何其他领域。如果你这样做,我上面列出的查询集将修改你得到的结果,并且如果你想使用输入的其他值返回,你可能无法得到你想要的结果...