django admin后台系统

Django中默认集成了后台数据管理页面,通过简单的配置就可以实现模型后台的Web控制台。
管理界面通常是给系统管理员使用的,用来完成数据的输入,删除,查询等工作。
使用以下models来示范admin后台系统的用法。
    from django.db import models

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()

class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()

class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()

使用admin后台系统之前,需要先创建一个系统管理员,创建管理员之前需先同步数据库。
    python manager.py createsuperuser
设置为中文
    settings中LANGUAGE_CODE = 'zh-hans'

设置时间,时区
    TIME_ZONE='Asia/Shanghai'

添加自己的数据模型
    在admin.py中注册
    admin.site.register(Publisher)
    admin.site.register(Author)
    admin.site.register(Book))
在admin中给model添加数据。
给模型加上__str__函数,比如给Author模型添加str函数,让author的显示更加友好:
        def __str__(self):
    return u'%s %s' % (self.first_name, self.last_name)
希望控制admin中添加model数据时的动作,可以修改相应字段的属性。比如author的email字段运行添加的时候为空。在email字段定义中加上blank=True,又比如给book的publication_date添加blank=True, null=True属性。
修改models属性之后记得及时做数据迁移。
使用verbose_name属性指定字段的别名。比如给publisher的name字段指定一个中文的别名verbose_name='出版社名称'。
在models的修改页面,默认显示的是models定义的str函数返回的字符串。
通过定义MoldelAdmin来定制model在admin的表现。比如给Author定义AuthorAdmin。
    class AuthorAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'last_name', 'email')
相应的注册代码也要变化:
    admin.site.register(Author, AuthorAdmin)
给Author添加一个搜索框:
    search_fields = ('first_name', 'last_name')
给book添加一个过滤器
    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
过滤器不光可以作用在日期字段上,还可以作用在boolean类型和外键上。
另一种增加日期过滤的方式:
    date_hierarchy = 'publication_date'
字段排序:
    ordering = ('-publication_date',)
修改编辑页面显示的字段及显示顺序,默认按照models中字段的定义顺序显示:
    fields = ('title', 'authors', 'publisher', 'publication_date')
与fields相反的字段是exclude
    exclude = ['publication_date',] 
改善多对多关系中对象选择操作,比如给BookAdmin添加如下属性:
    filter_horizontal = ('authors',)
filter_horizontal和filter_vertical 选项只适用于多对多关系。
一对多的外键关系,admin使用select box来表示。如不想用select box,可添加如下属性,让原来一次性加载所有publisher的select box变成填写publisher的id:
    raw_id_fields = ('publisher',)

让字段分组显示,fieldsets和上面提到的field不能同时出现:
    fieldsets = (
    ('作者', {'fields': ('authors',)}),
    ('出版商', {'fields': ('publisher',)}),
)
定制list_display字段的显示。比如给Author加一个布尔型gender字段,来表示性别。为了让显示更加人性化:
    #定制显示属性
    def showgender(self):
        if self.gender:
            return '男'
        else:
            return '女'

    list_display = ('first_name', 'last_name', 'email',showgender)
给该函数设置简短描述,让显示更加友好:
    showgender.short_description = '性别'    
    
可以将modeladmin的属性简单划分为列表页属性和添加、修改页属性
# 列表页属性
list_display,list_filter,search_fields,list_per_page等
# 添加、修改页属性
fields ,fieldsets, filter_horizontal, raw_id_fields等

创建管理对象:
继承自admin.TabularInline,指定model,及要创建的条数。比如:
class BooksInfo(admin.TabularInline):
    model = Book
    extra = 2
StackedInline类似。

定制化admin站点信息:
    1)修改模板文件。比如定制admin登录页面的title:
        {% extends 'admin/login.html' %}
        {% block content_title %}
            admin小学堂
        {% endblock %}
    2)自定义AdminSite
        class MyAdminSite(admin.AdminSite):
            site_header = '千峰招生管理'
            site_url = 'welcome'
            site_title = '千峰管理员'

            mysite = MyAdminSite()
            mysite.register(Publisher)
            mysite.register(Book, BookAdmin)
            mysite.register(Author, AuthorAdmin)

-------------------------------------------------------------------------------------------------------------------------------------

class BookInf(admin.TabularInline):
    model = Book

class ChubansheAdmin(admin.ModelAdmin):
    list_display = ['chubanshe_name', 'chubanshe_address']
    inlines = [
        BookInf,
    ]

效果图:

在apps中:

from django.apps import AppConfig

class ZuozheConfig(AppConfig):
    name = 'zuozhe'
    verbose_name = '作家管理'

在__init__中:

default_app_config = 'zuozhe.apps.ZuozheConfig'

效果如图:

-------------------------------------------------------------------------------------------------------------------------------------

自定义Adminsite:

admin.py:    

class Mysite(admin.AdminSite):
    site_header = '千峰管理'
    site_title = '千峰管理员'
    site_url = reverse_lazy('index')

mysite = Mysite(name='admin')
class ZuozheAdmin(admin.ModelAdmin):
    list_display = ['zuozhe_name', 'age', 'showgender']

# admin.site.register(Zuozhe, ZuozheAdmin)
mysite.register(Zuozhe, ZuozheAdmin)

urls.py:

# url(r'^admin/', admin.site.urls),
url(r'^admin/', mysite.urls),

效果如图:

猜你喜欢

转载自blog.csdn.net/yx1179109710/article/details/81386298