admin站点
基本设置
1 数据准备:使用上个项目的模板,以及数据库
2 创建超级管理员:
python manage.py createsuperuser
3 进入admin页面,登录。
4 在admin.py文件中注册模型类:admin.site.register(模型类,定制类)
5 英文变中文
应用名的修改:在app.py中添加属性 verbose_name='中文名'
模型类名的修改:在models.py中的Meta
类里添加属性
verbose_name='中文名'
verbose_name_plural=verbose_name # 复数
模型类中属性名的修改:在属性对象的参数中添加
verbose_name='中文名'
列表页面某个类的对象转成字符串:在模型类里重写__str__
函数:
def str(self):
return self.title(name) (name为模型类里的属性名)
6 调整站点显示信息
在admin.py文件中添加信息
admin.site.site_header = '以飞书屋' --网站页头
admin.site.site_title = '以飞书屋MIS' --页面标语
admin.site.index_title = '欢迎使用以飞书屋MIS' --首页标语
基本操作
1 定制类
在admin.py自定义类,继承于admin.MOdelAdmin
class BookInfoAdmin(admin.ModelAdmin):
使用定制类:在admin.py中: admin.site.register(模型类,定制类)
2 列表页的选项(在定制类中操作)
list_per_page = 10 -----分页时每页显示的条数
actions_on_top = True -----动作在顶部显示,False不在顶部显示,默认为True。
actions_on_bottom = True -----动作在底部显示,False不在底部显示,默认为False。
list_display = ['id', 'title', 'pub_date', 'bpub_date']--表格中要显示的内容
model中的模型类自定义方法:
def bpub_date(self):
return self.pub_date.strftime('%Y-%m-%d')
bpub_date.short_description = '自定义日期' # 方法字段在admin中显示的标题
bpub_date.admin_order_field = 'id' #根据属性id排序,自定义方法不能排序
list_filter = ['book','gender']:右侧快速过滤
search_fields = ['name','content']:顶部搜索框
3 编辑页的选项(在定制类中操作)
指定可编辑的属性:fields=['title','pub_date']
分组显示: fieldsets = (
('必填项', {'fields': ('title', 'pub_date')}),
('可填项', {'fields': ('bread', 'comment')}),
)
关联对象,嵌入类:在一对多的关系中,可以在一端编辑多端对象:TabularInline:表格形式嵌入 StackedInline:块形式嵌入
class HeroInfoStackInline(admin.StackedInline):
model = HeroInfo # 要编辑的对象
extra = 1 # 附加编辑的数量
在一端添加嵌入类
4 上传文件
保存到:media/booktest/文件名
模型类中添加属性字段(再添加到admin定制类中)(添加字段后需要数据库迁移)
face = models.ImageField(upload_to='booktest',null=True,blank=True)
在配置文件中添加配置
STATICFILES_DIRS = [
# 开发项目时使用的静态文件
os.path.join(BASE_DIR, 'static'),
# 项目运行时用户上传的图片
os.path.join(BASE_DIR, 'media'),
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
REST
REST基本知识
1 前后端不分离:
前端页面看到的效果都是由后端控制,由后端渲染页面或重定向
也就是后端需要控制前端的展示,前端和后端的耦合度很高;适合纯网页应用。
2 前后端分离:
后端仅返回前端所需数据,不再控制前端的效果。由前端自己决定。
耦合度相对较低。后端开发的每个视图称为接口,前端访问接口来对数据增删改查
3 API接口:
http协议的url路径,通过请求这个路径,传递参数,获取数据; API接口是符合REST规范的,是标准的RESTful接口
4 REST是一种设计接口的规范,而不是一种代码的编写方式(url地址命名的规范)
5 非REST的url:http://.../queryGoods?id=1001&type=t01
REST的url: http://.../t01/goods/1001
RESTful设计: Get/books/...
1 路径url地址:
不能包含动词、名词与数据库表名对应、建议使用复数形式
2 对于资源的具体操作类型,由HTTP动词表示
- GET(select):从服务器取出资源(一项或多项)。
- POST(insert):在服务器新建一个资源。
- PUT(update):在服务器更新资源(客户端提供改变后的完整资源)。
- DELETE(delete):从服务器删除资源。
- PATCH(update):在服务器更新(更新)资源(客户端提供改变的属性)。
- HEAD:获取资源的元数据。
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的
3 数据操作的格式,请求和返回均为json
django实现RESTful
1 写一套支持图书数据增删改查的REST API接口,来理解REST API的开发。
在此案例中,前后端均发送JSON格式数据
2 在开发REST API接口时视图中做的最主要有三件事:
- 将请求的数据(如JSON格式)转换为模型类对象
- 操作数据库
- 将模型类对象转换为响应的数据(如JSON格式)
3 总结
- 将数据库数据序列化为前端所需要的格式,并返回;
- 将前端发送的数据反序列化为模型类对象,并保存到数据库中。
4 见代码
import json
from datetime import datetime
from django.http import HttpResponse
from django.http import JsonResponse
from .models import BookInfo
from django.views import View
class BooksView(View):
def get(self, request):
'''
查询所有图书对象
'''
blist = BookInfo.objects.all() # [book,book,...]
# 将列表对象转成列表,里面存字典
blist2 = []
for book in blist:
book_dict = {
'id': book.id,
'title': book.title,
'pub_date': book.pub_date.strftime('%Y-%m-%d')
}
blist2.append(book_dict)
return JsonResponse({'blist': blist2}) # {blist:[{},{},{}...]}
def post(self, request):
'''
添加图书对象
'''
# 接收
json_bytes = request.body
json_str = json_bytes.decode()
json_dict = json.loads(json_str)
# 创建对象并保存
title1 = json_dict.get('title')
pub_date1 = datetime.strptime(json_dict.get('pub_date'), '%Y-%m-%d')
book = BookInfo.objects.create(title=title1, pub_date=pub_date1)
# 返回
return JsonResponse({
'id': book.id,
'title': book.title,
'pub_date': book.pub_date.strftime('%Y-%m-%d')
})
class BookView(View):
def get(self, request, pk):
'''
根据主键查询图书对象
'''
book = BookInfo.objects.get(pk=pk)
return JsonResponse({
'id': book.id,
'title': book.title,
'pub_date': book.pub_date.strftime('%Y-%m-%d')
})
def put(self, request, pk):
'''
根据主键修改图书对象
'''
# 接收
json_bytes = request.body
json_str = json_bytes.decode()
json_dict = json.loads(json_str)
# 修改并保存
book = BookInfo.objects.get(pk=pk)
book.title = json_dict.get('title')
book.pub_date = datetime.strptime(json_dict.get('pub_date'), '%Y-%m-%d')
book.save()
# 返回
return JsonResponse({
'id': book.id,
'title': book.title,
'pub_date': book.pub_date.strftime('%Y-%m-%d')
})
def delete(self, request, pk):
'''
根据主键删除图书对象
'''
book = BookInfo.objects.get(pk=pk)
book.delete()
return HttpResponse(status=204)