Django中Admin管理站点的使用

1,250 阅读5分钟

Django能够根据定义的模型类自动地生成管理页面,也就是后台管理站点。

使用Django的管理模块,需要按照如下步骤操作:

  1. 管理界面本地化

  2. 创建管理员

  3. 注册模型类

  4. 自定义管理页面

1 管理界面本地化

在settings.py中设置语言和时区

LANGUAGE_CODE = 'zh-hans' # 使用中国语言
TIME_ZONE = 'Asia/Shanghai' # 使用中国上海时间

2 创建超级管理员

创建管理员的命令如下,按提示输入用户名、邮箱、密码。

python manage.py createsuperuser

打开浏览器,在地址栏中输入如下地址后回车。

http://127.0.0.1:8000/admin/

输入前面创建的用户名、密码完成登录。

3 App应用配置

在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。

在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如

from django.apps import AppConfig​
class BooktestConfig(AppConfig):
    name = 'book'

我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。

  • AppConfig.name 属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。

  • AppConfig.verbose_name 属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如

    from django.apps import AppConfig
    
    class BooktestConfig(AppConfig):
        name = 'book'
        verbose_name = '图书管理'

4 注册模型类

登录后台管理后,默认没有我们创建的应用中定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并进行增删改查操作。

打开应用中的admin.py文件,编写如下代码:

from django.contrib import admin
from booktest.models import BookInfo,HeroInfo

admin.site.register(BookInfo)
admin.site.register(HeroInfo)

到浏览器中刷新页面,可以看到前面定义过的模型类BookInfoHeroInfo了。

  • admin.site.site_header 设置网站页头

  • admin.site.site_title 设置页面标题

  • admin.site.index_title 设置首页标语

在应用admin.py文件中添加一下信息

from django.contrib import admin

admin.site.site_header = '星空书城'
admin.site.site_title = '星空书城'
admin.site.index_title = '欢迎使用星空书城'

5.定义与使用Admin管理类

Django提供的Admin站点的展示效果可以通过自定义ModelAdmin类来进行控制。

定义管理类需要继承自admin.ModelAdmin类,如下

from django.contrib import admin​class

BookInfoAdmin(admin.ModelAdmin):
    pass

使用管理类有两种方式:

  • 注册参数

    admin.site.register(BookInfo,BookInfoAdmin)
  • 装饰器

    @admin.register(BookInfo)
    class BookInfoAdmin(admin.ModelAdmin):
        pass

list_per_page

每页中显示多少条数据,默认为每页显示100条数据,属性如下:

list_per_page=100

1)打开admin.py文件,修改如下:

class BookInfoAdmin(admin.ModelAdmin):
    list_per_page = 3 # 修改每页显示为3条

"操作选项"的位置

顶部显示的属性,设置为True在顶部显示,设置为False不在顶部显示,默认为True。

actions_on_top=True

底部显示的属性,设置为True在底部显示,设置为False不在底部显示,默认为False。

actions_on_bottom=False

列表中的列

属性如下:

list_display=[模型字段1,模型字段2,...]

1)打开应用中admin.py文件,修改自定义Admin如下:

class BookInfoAdmin(admin.ModelAdmin): 
      list_display = ['id','btitle','bread']

关联对象

无法直接访问关联对象的属性或方法,可以在模型类中封装方法,访问关联对象的成员。

1)打开应用中models.py文件,修改自定义Admin类如下:

class HeroInfo(models.Model):
    
    def read(self):
        return self.hbook.bread

    read.short_description = '图书阅读量'

2)打开应用中admin.py文件,修改自定义Admin类如下:

class HeroInfoAdmin(admin.ModelAdmin):
    
    list_display = ['id', 'hname', 'hbook', 'read']

右侧栏过滤器

属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复值的字段。

list_filter=[]

1)打开应用中admin.py文件,修改自定义Admin如下:

class HeroInfoAdmin(admin.ModelAdmin):
   list_filter = ['hbook', 'hgender']

搜索框

属性如下,用于对指定字段的值进行搜索,支持模糊查询。列表类型,表示在这些字段上进行搜索。

search_fields=[]

1)打开应用中dmin.py文件,修改自定义Admin类如下:

class HeroInfoAdmin(admin.ModelAdmin):
    
   search_fields = ['hname']

分组显示

属性如下:

fieldsets=(
    ('组1标题',{'fields':('字段1','字段2')}),
    ('组2标题',{'fields':('字段3','字段4')}),
)

关联对象

在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种。

  • 类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑。

  • 子类TabularInline:以表格的形式嵌入。

  • 子类StackedInline:以块的形式嵌入。

上传图片

Django有提供文件系统支持,在Admin站点中可以轻松上传图片。

使用Admin站点保存图片,需要安装Python的图片操作包

pip install Pillow
1 配置

默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径。

我们可以将上传的文件保存在静态文件目录中,如我们之前设置的static_files目录中在settings.py 文件中添加如下上传保存目录信息

MEDIA_ROOT=os.path.join(BASE_DIR,"static_files/media")
2 模型类添加ImageField字段

我们为之前的BookInfo模型类添加一个ImageFiled

class BookInfo(models.Model):
    
    image = models.ImageField(upload_to='book', verbose_name='图片', null=True)
  • upload_to 选项指明该字段的图片保存在MEDIA_ROOT目录中的哪个子目录

进行数据库迁移操作

python manage.py makemigrations
python manage.py migrate
3 使用Admin站点上传图片

进入Admin站点的图书管理页面,选择一个图书,能发现多出来一个上传图片的字段

选择一张图片并保存后,图片会被保存在static_files/media/book/目录下。

在数据库中,我们能看到image字段被设置为图片的路径。