1、Django_admin组件的意义

作者:Eric
微信:loveoracle11g

新建Django项目bms图书管理系统

App为book

book/models.py添加表关系

from django.db import models

# Create your models here.

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 与Publish表建立一对多的关系,外键字段建立在多的一方
    publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors = models.ManyToManyField(to="Author",)

敲两条命令迁移数据

F:\深圳骑士计划\crm\bms>python manage.py makemigrations
Migrations for 'book':
  book\migrations\0001_initial.py
    - Create model Author
    - Create model AuthorDetail
    - Create model Book
    - Create model Publish
    - Add field publish to book
    - Add field authorDetail to author

F:\深圳骑士计划\crm\bms>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, book, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying book.0001_initial... OK
  Applying sessions.0001_initial... OK

多出了一个db.sqlite3文件

http://127.0.0.1:8000/admin

它给我跳转到登录界面了,它里面用的是redirect

打开Run manage.py Task

输入命令创建超级用户

manage.py@bms > createsuperuser
输入用户名:yuan
邮箱:不写
输入密码:yuan1234
再次输入密码:yuan1234
manage.py@bms > createsuperuser
"D:\Pycharm\PyCharm 2018.3.2\bin\runnerw64.exe" C:\Python36\python.exe "D:\Pycharm\PyCharm 2018.3.2\helpers\pycharm\django_manage.py" createsuperuser F:/深圳骑士计划/crm/bms
Tracking file by folder pattern:  migrations
Username (leave blank to use 'zhouwanchun'):  yuan
Email address:
Warning: Password input may be echoed.
Password:  yuan1234
Warning: Password input may be echoed.
Password (again):  yuan1234
Superuser created successfully.

那我们就可以登录了

在book/admin.py

from django.contrib import admin

# Register your models here.

# from .models import Book, Publish, Author
from book.models import Book, Publish, Author

admin.site.register(Book)
admin.site.register(Publish)
admin.site.register(Author)

接下来项目重启,刷新浏览器

BOOK就是App应用

下面有三张表Authors、Books、Publishs

点击Publishs表,里面什么都没有,可以自己添加数据行,点击ADD PUBLISH

在book/models.py里面的class Publish下面添加

    def __str__(self):
        return self.name

再来添加出版社

回到 http://127.0.0.1:8000/admin/

点击 Publishs

再随便点击一个出版社,比如橘子出版社,发现有删除功能了

点击Delete,然后Yes I'm sure.  把这个橘子出版社就删除了。

看文件数据库这边跟着同步信息了

我们再把 橘子出版社 添加过来

回到首页 http://127.0.0.1:8000/admin/

点击 Authors表,添加ADD AUTHOR

在book/models.py里面的class Author下面添加

    def __str__(self):
        return self.name

再来添加一个作者,太白 20岁

点击Alex,可以删除,可以修改,那我们修改Alex为35岁

回到首页 http://127.0.0.1:8000/admin/

点击Books, 添加ADD BOOK

在book/models.py里面的class Book下面添加

    def __str__(self):
        return self.title

再添加一个书籍《三国演义》,但是我想让它加入到西瓜出版社,可以直接创建西瓜出版社

再来添加一本书籍《金瓶煤》

在book/admin.py添加修改

from django.contrib import admin

# Register your models here.

# from .models import Book, Publish, Author
from book.models import Book, Publish, Author

class BookConfig(admin.ModelAdmin):
    list_display = ["title", "publishDate", "price", "publish"]

admin.site.register(Book, BookConfig) # 意思是你展示Book时要听BookConfig的
admin.site.register(Publish)
admin.site.register(Author)

重启项目,刷新浏览器

这里还有一个批量删除功能

2、Django_admin组件的自定制列

我们再来创建一个App
manage.py@bms > startapp app01

项目配置文件注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig',
    'app01',
]

在app01/models.py里写

from django.db import models

# Create your models here.

class Host(models.Model):
    name = models.CharField(max_length=32)

然后迁移数据

F:\深圳骑士计划\crm\bms>python manage.py makemigrations
Migrations for 'app01':
  app01\migrations\0001_initial.py
    - Create model Host

F:\深圳骑士计划\crm\bms>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app01, auth, book, contenttypes, sessions
Running migrations:
  Applying app01.0001_initial... OK

在app01/admin.py里面写

from django.contrib import admin

# Register your models here.
from .models import Host

admin.site.register(Host)

然后重启项目,浏览器访问项目首页

查看页面:http://127.0.0.1:8000/admin/app01/host/
添加页面:http://127.0.0.1:8000/admin/app01/host/add/
编辑页面:http://127.0.0.1:8000/admin/app01/host/1/change/    host后面数字1不固定
编辑页面:http://127.0.0.1:8000/admin/app01/host/2/change/
删除页面:http://127.0.0.1:8000/admin/app01/host/2/delete/

在book/admin.py里写,自定制显示列

from django.contrib import admin

# Register your models here.

# from .models import Book, Publish, Author
from book.models import Book, Publish, Author

class BookConfig(admin.ModelAdmin):
    list_display = ["title", "publishDate", "price", "publish"]

class PublishConfig(admin.ModelAdmin):
    list_display = ["name", "city", "email"]

admin.site.register(Book, BookConfig) # 意思是你展示Book时要听BookConfig的
admin.site.register(Publish, PublishConfig)
admin.site.register(Author)

重启项目,浏览器访问 http://127.0.0.1:8000/admin/book/publish/

自定制显示列,多对多

from django.contrib import admin

# Register your models here.

# from .models import Book, Publish, Author
from book.models import Book, Publish, Author

class BookConfig(admin.ModelAdmin):
    # 自定制显示列
    def show_authors(self, obj):
        return " , ".join([obj.name for obj in obj.authors.all()])

    list_display = ["title", "publishDate", "price", "publish", "show_authors"]

class PublishConfig(admin.ModelAdmin):
    list_display = ["name", "city", "email"]

admin.site.register(Book, BookConfig) # 意思是你展示Book时要听BookConfig的
admin.site.register(Publish, PublishConfig)
admin.site.register(Author)

重启项目,浏览器访问: http://127.0.0.1:8000/admin/book/book

在book/models.py里面的class Book添加修改

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    state = models.IntegerField(choices=[(1, "已出版"), (0, "未出版")], default=1)

    # 与Publish表建立一对一的关系,外键字段建立在多的一方
    publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors = models.ManyToManyField(to="Author",)

    def __str__(self):
        return self.title

执行数据迁移

manage.py@bms > makemigrations
manage.py@bms > migrate

在book/admin.py里添加修改class BookConfig

class BookConfig(admin.ModelAdmin):
    # 自定制显示列
    def show_authors(self, obj):
        return " , ".join([obj.name for obj in obj.authors.all()])

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state"]

重启项目,浏览器刷新访问

嘿!它自己给我展示出来了"已出版",现在我就想让它展示数据库里面存的那个值

在book/admin.py里面添加修改

class BookConfig(admin.ModelAdmin):
    # 自定制显示列
    def show_authors(self, obj):
        return " , ".join([obj.name for obj in obj.authors.all()])

    def show_state(self, obj):
        return obj.state

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state", "show_state"]

重启项目,刷新浏览器访问

你要是这样写的话

    def show_state(self, obj):
        # return obj.state
        return obj.get_state_display()

是不是和左边的state显示一样了呀

3、Django_admin组件的其他功能

我们设备按着日期时间超链接

class BookConfig(admin.ModelAdmin):
    # 自定制显示列
    def show_authors(self, obj):
        return " , ".join([obj.name for obj in obj.authors.all()])

    def show_state(self, obj):
        # return obj.state
        return obj.get_state_display()

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state", "show_state"]
    list_display_links = ["publishDate",]

重启项目,刷新浏览器

想加几个加几个超链接

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state", "show_state"]
    list_display_links = ["title", "publishDate"]

重启项目,刷新浏览器

添加搜索框功能

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state", "show_state"]
    list_display_links = ["title", "publishDate"]
    search_fields = ["title"]

搜索三国,看三国演义出来了吧。

批量处理功能

    list_display = ["title", "publishDate", "price", "publish", "show_authors", "state", "show_state"]
    list_display_links = ["title", "publishDate"]
    search_fields = ["title"]
    # action操作
    def patch_init(self, request, queryset):
        print("OK")
    patch_init.short_description = "批量处理"  # 起个中文名字
    actions = [patch_init]

批量处理书籍的价格

    # action操作
    def patch_init(self, request, queryset):
        print("OK")
        queryset.update(price=0)
    patch_init.short_description = "价格初始化为0元"  # 起个中文名字
    actions = [patch_init]

多级过滤框

    list_filter = ["publish"]

它是可以放多对多字段的
    list_filter = ["publish", "authors"]

排序,按照书籍的价格,首先你要编辑所有书籍的价格,因为刚才价格重置为0了

    ordering = ["price"]  # 默认升序

    ordering = ["-price"]  # 降序排列

    ordering = ["-price", "-nid"]  # 如果价格一样,可以按照id排列
    change_list_template = "index.html"  # 以后前端工程师写好了网页,你拿过来放在templates目录里直接用就行了。现在Django用的自己html文件

本节课内容写完

Django_admin组件的更多相关文章

  1. Django学习---Form组件认证

    Form组件认证 能够帮助我们做用户认证. 以前写我们自己写用户认证的时候,我们自己写HTML的form表单,点击提交,数据就被发送到后台,后台进行验证.在验证过程中我们就需要自己去写正则表达式去匹配 ...

  2. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  3. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  4. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  5. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  6. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  7. .NET Core 首例 Office 开源跨平台组件(NPOI Core)

    前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...

  8. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  9. BootStrap_02之全局样式及组件

    1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...

随机推荐

  1. 【C/C++】泛型栈

    用 C 语言实现泛型栈 mystack.h #ifndef __MYSTACK_H__ #define __MYSTACK_H__ #include <assert.h> // C sty ...

  2. Vue.js 3.0 新特性预览

    总结起来,Vue 3 以下方面值得我们期待 : 更快 更小 更易于维护 更多的原生支持 更易于开发使用 完整的PPT:docs.google.com/presentatio… Evan 和 Vue 团 ...

  3. C/S与B/S的区别

    C/S与B/S的区别 1.区别 1.B/S架构是针对C/S架构缺点进行改进后提出的网络结构模式. B/S结构属于C/S结构,是一种特殊的C/S,因为浏览器只是特殊的客户端. 2.C/S可以使用任何通信 ...

  4. keepalived高可用集群。

    keepalived故障切换转移原理1vrrp协议:(vritual router redundancy protocol)虚拟路由冗余协议,2故障转移.keepalived三大功能1实现物理高可用, ...

  5. 使用Stickers拓展集成iMessage简单功能

    添加一个target,选择Stickers拓展: 然后就会出现iMessage的文件夹:添加你需要的iMessage图片,这里图片遵循下面的要求: Small: 100 x 100 pt @3x sc ...

  6. 初始C#(二)

    一 数组 定义:能存放任意多个同类型数据 声明与赋值:声明:数据类型[ ]变量名                                        赋值:变量名=new 数据类型[长度] ...

  7. 周强201771010141《面向对象程序设计(java)》第一周学习总结

    周强201771010141<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com ...

  8. Linux系统-禁ping

    1) Add the following line to your /etc/sysctl.conf net.ipv4.icmp_echo_ignore_all=1 Then : sysctl -p ...

  9. ngnix 500错误原因分析

    参考http://www.cnblogs.com/huqiang/p/5333975.html

  10. 2018 vue前端面试题

    1.active-class是哪个组件的属性?嵌套路由怎么定义?答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数? 答: ...