zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    MQTT TLS 加密传输
    python多进程并发redis
    各种消息队列的特点
    mqtt异步publish方法
    Numpy API Analysis
    Karma install steps for unit test of Angular JS app
    reinstall bower command
    Simulate getter in JavaScript by valueOf and toString method
    How to: Raise and Consume Events
    获取对象的类型信息 (JavaScript)
  • 原文地址:https://www.cnblogs.com/davis12/p/14376859.html
Copyright © 2011-2022 走看看