django文档总结之后台管理、RESTFUL(4)

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)

原文地址:https://www.cnblogs.com/davis12/p/14376859.html