女兵的小秘密,疯魔美女豆瓣,索爱t55
django最强大的部分之一是自动管理界面。它从模型中读取元数据,以提供快速,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容。管理员的推荐用途仅限于组织的内部管理工具。它不是用于构建整个前端。
管理员有许多用于自定义的钩子,但要注意尝试专门使用这些钩子。如果您需要提供一个更加以流程为中心的接口来抽象出数据库表和字段的实现细节,那么可能是时候编写自己的视图了。
django-admin startproject crm_v1
python manage.py startapp bms
修改settings.py
installed_apps = [ 'django.contrib.admin', ...... 'bms.apps.bmsconfig', ]
在 django 里写一个数据库驱动的 web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。
设计哲学
模型是真实数据的简单明确的描述。它包含了储存的数据所必要的字段和行为。django 遵循 dry principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。
来介绍一下迁移 - 举个例子,不像 ruby on rails,django 的迁移代码是由你的模型文件自动生成的,它本质上只是个历史记录,django 可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。
from django.db import models class publish(models.model): name = models.charfield(max_length=32) city = models.charfield(max_length=32) email = models.emailfield() def __str__(self): return self.name class author(models.model): name = models.charfield(max_length=16) age = models.integerfield() def __str__(self): return self.name class book(models.model): title = models.charfield(max_length=32) publish = models.foreignkey(to="publish", on_delete=models.cascade) pub_date = models.datefield() price = models.decimalfield(max_digits=6, decimal_places=2) author = models.manytomanyfield(to="author") state = models.integerfield(choices=[(1, "已出版"), (2, "未出版")], default=1) def __str__(self): return self.title
为模型的改变生成迁移文件
python manage.py makemigrations
应用用数据库迁移
python manage.py migrate
数据库迁移被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。
通常我们在生成项目时会在 urls.py 中自动设置好,
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls),]
python manage.py createsuperuser
启动django项目
输入url:
即可看到登录页面,输入刚才创建的用户名和密码进行登录
登录成功后可以看到如下页面
在admin.py中只需要将mode中的某个类注册,即可在admin中实现增删改查的功能
from django.contrib import admin
from django.contrib import adminfrom bms.models import book,publish,author,authordetail
admin.site.register(book)
admin.site.register(publish)
admin.site.register(author)
以上是注册book,publilsh, author类,在admin中即可看到
通过点击add分别给author,book ,publish 添加数据
再创建书籍是可以看到一件有了出版社和作者的选择
可以看到只要书籍名称,没有作者、价格、出版社等信息
需要利用modeladmin进行操作
class bookinfo(admin.modeladmin): list_display = ['title', 'price', 'publish'] # list_displey 中的字段必须是和数据库中有的 admin.site.register(book, bookinfo)
可以看到已经多了两列信息
class bookinfo(admin.modeladmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()])
list_display = ['title', "show_author", 'price', 'publish', 'state']
admin.site.register(book, bookinfo)
class bookinfo(admin.modeladmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] # 列表中写筛选的字段 admin.site.register(book, bookinfo)
class bookinfo(admin.modeladmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] search_fields = ['author__name', 'price', 'title', 'publish__name'] # 由于 author是多对的字段,publish是外键,故不能直接写字段名,必须跨表查看 admin.site.register(book, bookinfo)
class bookinfo(admin.modeladmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) list_display = ['title', "show_author", 'price', 'publish', 'state'] list_filter = ['publish', 'author'] search_fields = ['author__name', 'price', 'title', 'publish__name'] def func(self, request, queryset): print(self, request, queryset) print(request.post.getlist("_selected_action")) def price_to_zero(self, request, queryset): queryset.update(price=0) # 把选择的价格都设置为0 func.short_description = "自定义action动作" price_to_zero.short_description = "价格初始化" # 设置在action下拉菜单中显示的信息 actions = [func, price_to_zero] # 把自定义的两个方法添加到actions中
# action选项都是在页面上方显示
actions_on_top = true
# action选项都是在页面下方显示
actions_on_bottom = false
admin.site.register(book, bookinfo)
(1)选择刚才定义的action动作
可以看到后台的输出
(2)执行价格初始化动作
结果如下,可以看到价格已经设置为0
设置根据id,价格排序,也可反向排序 return ['-title', 'price']
class bookinfo(admin.modeladmin): ...... def get_ordering(self, request): return ['title', 'price']
点击title列或者price列即可进行排序
修改settings.py文件
将language_code = 'en-us'改为
language_code = 'zh-hans'
也可设置表的字段为中文,加上 verbose_name选项即可。
class book(models.model): title = models.charfield(max_length=32,verbose_name="书名") publish = models.foreignkey(to="publish", on_delete=models.cascade,verbose_name="出版社") pub_date = models.datefield(verbose_name="出版日期") price = models.decimalfield(max_digits=6, decimal_places=2,verbose_name="价格") author = models.manytomanyfield(to="author",verbose_name="作者") state = models.integerfield(choices=[(1, "已出版"), (2, "未出版")], default=1,verbose_name="状态") def __str__(self): return self.title
效果如下:
show author还是英语的,现在来改一下
class bookinfo(admin.modeladmin): def show_author(self, obj): return " | ".join([author.name for author in obj.author.all()]) show_author.short_description = "作者"
short_description 设置字段的描述信息
最终结果如图
其他设置可参考 :
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python爬虫:Request Payload和Form Data的简单区别说明
浅谈Python中threading join和setDaemon用法及区别说明
Python3-异步进程回调函数(callback())介绍
python继承threading.Thread实现有返回值的子类实例
Python中使用threading.Event协调线程的运行详解
网友评论