Django管理过滤器

时间:2013-07-26 12:04:14

标签: django django-admin django-admin-filters

我有一个模型的多个实例,每个实例都有一个相关的电子邮件地址。但是,有几个实例具有相同的连接电子邮件地址,但是当我将filter['email']放入我的admin.py时,我会获得一个实例电子邮件的长列表,即在几种情况下的同一电子邮件的多个副本。

有没有办法删除多次列出的电子邮件?或者一种将过滤器视图定制为更好的东西的方法? (可能是下拉菜单?)

我目前没有ManyToManyField关系,或类似的关系。我的数据库中只包含字段nameemail的实例。我的models.py看起来像这样:

import ldapdb.models
from ldapdb.models.fields import CharField, IntegerField, ListField

class Item(ldapdb.models.Model):
    item = CharField(db_column='item', max_length=30, primary_key=True, unique=True)
    email = CharField(db_column='mail', max_length=20)

我的admin.py看起来像这样:

from items.models import Item
from django.contrib import admin

class ItemAdmin(admin.ModelAdmin):
    readonly_fields = ('email',)
    list_display = ('item', 'email')
    list_filter = ['email']
    search_fields = ['item']

admin.site.register(Item, ItemAdmin)

显然我一直在关注https://docs.djangoproject.com/en/1.3/ref/contrib/admin/,但我无法真正看到自定义管理员过滤视图的方式。

1 个答案:

答案 0 :(得分:1)

你可以发布一些代码吗?我不完全确定我理解实例与您的电子邮件之间的关系 - 它是一个电子邮件字段吗?对不同型号的ForeighKey?如果不是ManyToMany或类似关系,那么如何不止一个?如何在管理中完成过滤?

修改 好的,我现在明白了这个问题。你想要的是不可能的。请参阅django管理网站,它们是相同的电子邮件并不重要,因为它仍然是一个不同的对象。如果没有指定该字段是唯一的或者弄乱管理站点代码,那就无法解决这个问题。

更好的解决方案是将电子邮件配置为可在管理模型中搜索,然后当您搜索电子邮件example@example.com时,它将带回所有匹配项。

另一个好的解决方案是使电子邮件成为不同的模型,并通过ManyToMany关系将其链接到Item模型。然后使用一种方法创建一个EmailAdmin,该方法显示每封电子邮件的所有相关项目。

这完全取决于你真正需要的东西。最终,您可能希望编写自己的视图或使用管理站点将其修改为您需要的内容。

此外,您可能希望将电子邮件从CharField更改为EmailField。希望这有帮助!