admin 后台数据模型管理

新建项目默认自带的django-admin能够和Django数据模型无缝整合,为我们的Web应用程序提供后台数据管理功能,这个功能可以说是Django的杀手锏。对于一个随手写的小型网站,django-admin组件直接把一个开箱即用的后台给我们生成好了,直接给我们节省了一大半的开发时间。

当然,django-admin缺点也很明显,页面比较丑,增删改查功能比较僵硬,定制性很差,但对于大多数情况都足够了,这篇笔记简单介绍一下admin模块的使用方法。

Admin后台配置

创建工程默认的INSTALLED_APPS中已经包含Admin组件及其依赖相关的APP配置了。除此之外,我们需要配置Admin后台的路由地址。

urls.py

from django.contrib import admin
from django.urls import path


urlpatterns = [
    path('admin/', admin.site.urls),
]

以上配置完成后,我们可以创建一个管理员用户。

python manage.py createsuperuser

按照提示输入用户名、邮箱、密码、确认密码即可,创建完成我们即可通过该账号登录管理后台。

注:admin的登录功能默认是需要集成auth模块的,当然,这两个模块一般新创建项目时都是自带的。

注册模型

假设我们有这样一个定义好的数据模型:

from django.db import models
from ckeditor_uploader.fields import RichTextUploadingField


class Article(models.Model):
    """文章实体类"""
    title = models.CharField(verbose_name='标题', max_length=255)
    content = RichTextUploadingField(verbose_name='内容', max_length=65535, null=True, blank=True)
    create_time = models.DateTimeField(verbose_name='创建时间')
    last_modified_time = models.DateTimeField(verbose_name='最后修改时间')

    def __str__(self):
        return '[' + str(self.pk) + '] ' + self.title

注意模型定义中的verbose_name这个关键字参数,admin组件会读取该参数作为查询时表格字段的表头。

默认情况下,Admin后台除了用户管理,没有模型数据的管理,我们需要将模型数据注册到Admin组件。

admin.py

from django.contrib import admin
from mywiki.models import Article


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'create_time', 'last_modified_time')
    search_fields = ('content', 'title')

其中,@admin.register()装饰器将Article这个模型注册到了Admin管理后台,list_display指定列表展示的字段,search_fields定义了一个模糊匹配搜索功能。

注意:图中表格字段表头为中文名,而不是字段英文名,这是因为我们在数据模型字段上定义了verbose_name属性。

展示自定义字段

上面代码中介绍了使用list_display能够展示模型的字段,但如果要展示的内容在关联模型中,或者完全是通过计算得出的自定义字段,我们必须手动编写获取该字段的方法。

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'price', 'get_category']
    search_fields = ['title']

    def get_category(self, obj):
        return obj.category.name

上面代码中,在Book模型中展示其关联模型Category的名字。

集成ckeditor

Admin后台中,默认TextField使用原始的<textarea>组件进行输入处理,对于CMS系统等使用场景,我们显然需要一个富文本编辑器,django-admin可以很容易和ckeditor集成。

pip3 install django-ckeditor pillow

注:图片上传功能依赖pillow

settings.py中,INSTALLED_APPS内加入以下两个应用:ckeditorckeditor_uploader,并加入以下配置。

CKEDITOR_CONFIGS = {
    'default': {
        'toolbar': 'Full',
    },
}
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
CKEDITOR_UPLOAD_PATH = 'upload/'

CKEDITOR_CONFIGS用于配置ckeditor编辑器组件,之后的三个配置用于指定媒体上传路径。

urls.py中,加入路由path('ckeditor/', include('ckeditor_uploader.urls')),指定上传功能的上传路径。此外还需要配置MEDIA路径的静态访问权限(实际部署时还要配下Nginx)。

from django.conf.urls.static import static
from django.conf import settings
from django.contrib import admin
from django.urls import path, re_path, include


urlpatterns = [
    # ...其它路由配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

最后在模型中,我们使用RichTextUploadingField替换TextField即可(代码参考前面Article模型),它们的参数参数基本一致。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap