自定义列表
参考:http://docs.30c.org/djangobook2/chapter06/
自定义Author模块的列表中的显示字段。 列表默认地显示查询结果中对象的__unicode__()。 我们定义Author对象的__unicode__()方法,用以同时显示作者的姓和名。
class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField(blank=True, verbose_name='e-mail') **def __unicode__(self):** **return u'%s %s' % (self.first_name, self.last_name)**
结果正如图,列表中显示的是每个作者的姓名。
我们可以在这基础上改进,添加其它字段,从而改变列表的显示。 这个页面应该提供便利,比如说:在这个列表中可以看到作者的邮箱地址。如果能按照姓氏或名字来排序,那就更好了。
为了达到这个目的,我们将为Author模块定义一个ModelAdmin类。 这个类是自定义管理工具的关键,其中最基本的一件事情是允许你指定列表中的字段。 打开admin.py并修改:
from django.contrib import admin from mysite.books.models import Publisher, Author, Book class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') #添加字段显示 search_fields = ('first_name', 'last_name') #添加快速查询栏 admin.site.register(Publisher) # admin.site.register(Author) admin.site.register(Author,AuthorAdmin)
解释一下代码:
我们新建了一个类AuthorAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着一个类的自定义配置,以供管理工具使用。 我们只自定义了一项:list_display, 它是一个字段名称的元组,用于列表显示。 当然,这些字段名称必须是模块中有的。
添加一个快速查询栏。 向AuthorAdmin追加search_fields
我们修改了admin.site.register()调用,在Author后面添加了AuthorAdmin。你可以这样理解: 用AuthorAdmin选项注册Author模块。
admin.site.register()函数接受一个ModelAdmin子类作为第二个参数。 如果你忽略第二个参数,Django将使用默认的选项。Publisher和Book的注册就属于这种情况。
弄好了这个东东,再刷新author列表页面,你会看到列表中有三列:姓氏、名字和邮箱地址。 另外,点击每个列的列头可以对那列进行排序。并且在页面顶端看到一个查询栏。
PS:
list_display = ('first_name', 'last_name', 'email') #添加字段,以列表显示,not a ManyToManyField
search_fields = ('first_name', 'last_name') #页面添加查询栏
list_filter = ('publication_date',) #添加过滤(这里是过滤日期)
date_hierarchy = 'publication_date' #过滤(日期的另外一种过滤方式,可以添加后看一下)
ordering = ('-publication_date',) #排序(这里以日期排序,加‘-’表示降序)
fields = ('title', 'authors', 'publisher') #排除一些不想被其他人编辑的fields(不包含在内的不能编辑,这里publication_date不能编辑了)
filter_horizontal = ('authors',) #从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,must
be a ManyToManyField,且不能用于 ForeignKey字段,默认地,管理工具使用``
下拉框`` 来展现`` 外键`` 字段
filter_vertical
= ('authors',) #同上,垂直排列过滤器
raw_id_fields
= ('publisher',) #将ForeignKey字段从‘下拉框’改变为‘文本框’显示