上一节,我们已经实现了对admin进行简单的定制功能,我们是不是感觉还是缺少一个搜索功能呢?
我们只需要在admin.py中添加一个search_field字段,然后在中间编制你需要搜索的值。
但是事实当我们尝试进行作者搜索时,会出错。
因为author字段是关系表,要要链接到了另一条用户的几录,因此直接这样设置有问题的,我们可以使用连续的两个下划线来引用关系表相关的属性。
在User表中我们可以看见有username、first_name、last_name等字段
接下来我们可以进行如下设置:
我们是不是可以通过这种方式author__username,实现list_display呢?其实是不行的,但是我们可以在models中添加相关的属性:
在admin.py中添加相关的字段值进去:
@admin.register(Blog) class BlogAdmin(admin.ModelAdmin): # list_display用于设置列表页面要显示的不同字段 list_display = ['title','author','author_name','author_last_name','author_email'] # search_fields用于设置搜索栏中要搜索的不同字段 search_fields = ['title','author__username','content']
最后,所以的代码如下:
1、在blog中的admin.py
from django.contrib import admin from blog.models import Blog # Register your models here. @admin.register(Blog) class BlogAdmin(admin.ModelAdmin): # list_display用于设置列表页面要显示的不同字段 list_display = ['title','author','author_name','author_last_name','author_email'] # search_fields用于设置搜索栏中要搜索的不同字段 search_fields = ['title','author__username','content'] 2、在blog中的models.py
from django.db import models # Create your models here. class Blog(models.Model): title = models.CharField('标题', max_length=200) author = models.ForeignKey( 'auth.User', on_delete=models.SET_NULL, null=True, verbose_name='作者' ) content = models.TextField('内容') def __str__(self): return self.title def author_name(self): return '%s' % self.author.first_name author_name.short_description = '作者名称' def author_last_name(self): return "%s"%self.author.last_name author_last_name.short_description = '作者姓氏' def author_email(self): return '%s'%self.author.email author_email.short_description = '作者邮箱'