django快速开发实践:drf框架和xadmin配置指北(代码片段)

deali deali     2022-12-03     548

关键词:

步骤

既然是快速开发,那废话不多说,直接说步骤:

  • 安装Djagno
  • 安装Django Rest Framework
  • 定义models
  • 定义Rest framework的serializers
  • 定义Rest framework的viewsets
  • 配置Rest framework的router
  • 配置管理后台admin
  • 根据需要写template和对应的view

经过这些步骤就能得到一个具备完整的后端接口和后台管理界面的网站了,如果写了template的话还能把前端的工作也做了。

接下来按照上面提到的顺序记录一下我的开发实践。

定义models

好像没啥好说的,Django3多了几个新的特性,可以用class来定义choices,这个比以前的元组定义方便一些,其他的好像没什么了,对了,定义ManyToMany最好设置一个related_name,方便以后在代码里做反向查询。

定义serializers

这个很简单,只要告诉框架你需要序列化model的哪个字段就好了。
官方文档:https://www.django-rest-framework.org/tutorial/1-serialization/

代码例子如下:

from .models import *
from rest_framework import serializers

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = [‘name‘, ‘gender‘, ‘number‘, ‘faculty‘, ‘major‘, ‘year‘]

附上这个Student的model代码:

class Student(models.Model):
    name = models.CharField(‘姓名‘, max_length=10)
    gender = models.IntegerField(‘性别‘, default=1, choices=GenderChoices)
    number = models.CharField(‘学号‘, max_length=20, blank=True)
    faculty = models.CharField(‘学院‘, max_length=20, blank=True)
    major = models.CharField(‘专业‘, max_length=20, blank=True)
    year = models.CharField(‘届别‘, max_length=4)

    def __str__(self):
        return self.name

定义viewsets

就是把queryset和serializers关联起来。

贴一下代码,对应上面的student的serializers。

from rest_framework import viewsets
from .models import *
from .serializers import *

class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

配置router

可以理解为Rest Framework的urls配置。

代码:

from rest_framework import routers
from core import views

router = routers.DefaultRouter()
router.register(‘user‘, views.UserViewSet)

然后再加入Django的urls配置中:

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘api/‘, include(router.urls)),  # 这里
    path(‘api-auth/‘, include(‘rest_framework.urls‘)),  # 和这里
]

干净利索,这个router应该和urls一样能嵌套的,不过我没有深入学Rest Framework,所以没有了解到,以后有需要再查一下文档。

关于drf的简单参考文档:

配置管理后台admin

其实这一步也可以放在前面,就是刚定义完models的时候就配置,这样方便管理数据。

Django自带的这个admin可以说很强大了,可以省去很多中小型网站的管理后台开发工作,不过默认的界面是比较丑的,这个用过的人都懂,但是又想用,怎么办?所以要进行美化啊,以前我只知道xadmin这个库,国人开发的,基于bootstrap3界面,重写了整套admin代码,界面好看了不少,无奈有很多bug,文档又几乎是没有的,很多功能实现都只能去看代码,体验极差,严重影响开发效率……(但是为了界面好看我一开始还是只能用这个了)
关于Django配置详情可以看刘江大大的博客,很详细,在我下面的第一个参考链接里面~

界面效果大概这样:
技术图片

然后我又发现了一个新的xadmin替代品,叫simpleui,号称vue+element ui写的,界面也不错,实际体验嘛,emmm……和xadmin互有千秋。不过这货搞了个pro版本,也就是付费版,所以开源免费版这个能用就偷着乐了,你懂的。

界面如下,还可以换主题。
技术图片

有兴趣请看看官方github:https://github.com/newpanjing/simpleui

安装xadmin

现在Django-xadmin好像已经不维护了,至少在github上看到是作者去写纯前端的xadmin框架了,然后安装起来也是一波三折,你直接在pip安装也不行,因为那个是xadmin的0.x版本,支持的是Django1.x的,要安装xadmin的django2分支,才能支持Django2.x,然后我一开始用上Django3,貌似这货还和Django3有兼容问题……

那到底怎么安装才好啊?简单点的方法就是官方github说的:

pip install git+git://github.com/sshwsfc/xadmin.git@django2

不过这个方法我有时候可以有时候不行,好像是github被屏蔽了吧,唉,所以还有别的方法,就是安装打包好的wheel文件,从xadmin官方仓库把代码下载下来,然后checkout到django2分支,再运行命令打包成wheel文件,接着就可以拿去pip安装了,有空我上传到pypi,方便一下有需要的同学。

安装完运行可能还会报错:TypeError: render() got an unexpected keyword argument ‘renderer‘,原因是集成DjangoUeditor时出错,需要需要修改虚拟环境下的boundfield.py文件,位置在venv/lib/python3.6/site-packages/django/forms/boundfield.py,修改内容:

89        return widget.render(
90            name=self.html_initial_name if only_initial else self.html_name,
91            value=self.value(),
92            attrs=attrs,
93            # renderer=self.form.renderer,(93行处注释掉,就能正常运行了)
94        )

xadmin配置

xadmin的配置和Django的差不多,但是也有一点小区别,不过还好它支持Django的messages框架,simpleui好像不支持……有毒

Django admin的配置是写在每个app下面的admin.py文件的,xadmin得写在adminx.py里,然后好像也没法像Django一样用装饰器注册admin类,下面的代码展示了注册admin方法:

xadmin.site.register(model类, admin类)

注意xadmin的admin类还不能像Django一样继承ModelAdmin类,只能继承BaseAdminObject或干脆不写,我看xadmin的源码是继承自object的(跟不写一样)

下面这个例子就很全了,各种属性的配置。

class CourseAdmin(object):
    ‘‘‘课程‘‘‘
    list_display = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘]   #显示的字段
    search_fields = [‘name‘, ‘desc‘, ‘detail‘, ‘degree‘, ‘students‘]             #搜索字段
    list_filter = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘]    #过滤字段
    model_icon = ‘fa fa-book‘            #自定义图标
    ordering = [‘-click_nums‘]           #排序功能
    readonly_fields = [‘click_nums‘]     #只读字段,不能编辑
    exclude = [‘fav_nums‘]               #不显示的字段
    inlines = [LessonInline,CourseResourceInline]    #增加章节和课程资源
    list_editable = [‘degree‘,‘desc‘] #在列表页可以直接编辑的
    list_display = [‘get_zj_nums‘]  #直接使用函数名作为字段显示
    list_display = [‘go_to‘]  # 跳转到上面定义的地址
    refresh_times = [3,5]           #自动刷新(里面是秒数)可选3或5秒

admin类的属性详情

  • model_icon:图标用的是font awesome图标,不过这个网站国内好像访问不了,所以我们用国内版的网站替代,http://www.fontawesome.com.cn/icons-ui/
  • inlines的配置和Django的差不多,不过不能像Django一样集成xxxinline的父类……要定义的话参考下面的代码:
class LessonInline(object):
    model = Lesson
    extra = 0

class CourseResourceInline(object):
    model = CourseResource
    extra = 0
  • 还有一个图表功能,不过我觉得没啥用,主要是x坐标换成char字段就显示不出来了,很恶心,例子:
data_charts = 
        "user_count": ‘title‘: u"course_num", "x-field": "addtime", "y-field": ("course_num"),
                       "order": (‘addtime‘,)
        

效果这样:
技术图片

admin类的一些方法覆盖

为啥要覆盖?当然是要自定义一些操作啊,比如你要保存用户信息的时候验证某些字段,通过才给保存,不通过就给出提示,咋搞,覆盖父类函数呀!

代码例子:

class ExamineAdmin(BaseAdminObject):
    .......

    def save_models(self):
        # 获取保存的新对象
        obj = self.new_obj
        # 获取原来的对象,如果是创建新对象,则org_obj为空
        org_obj = self.org_obj

        if 不满足条件:
            self.message_user(message="不满足xxx条件", level=‘error‘)
        else:
            return super().save_models()

大概就这样,显示信息的话基本能满足,不过就算显示了“不满足xxx条件”的信息,不保存这个model对象,也还会出来一个保存成功信息,xadmin似乎没有提供api关掉,文档啥也没写,要解决这个问题还是自己啃xadmin代码吧,不然靠搜索和文档完全就是黑箱操作……无力吐槽

参考:

写在最后

不得不说,使用Python Django开发网站效率太高了,很方便就做出一套可以用的API+后台管理系统,拿来应付各种课程设计、需求简单的外包都是绰绰有余,而且相关资料也很多,有心学习的话花点时间掌握开发商业网站项目完全不在话下!至于有人质疑Python的性能,人家Instagram的后台就是全套Django开发的,这亿级的用户量可不是闹着玩的,了解一门技术之后好好深入学习提高比整天跟风搞些花里胡哨的有用得多了……

不过最近看了很多net core的博客和知乎问题,我还是看好这个net core5的未来,接下来花点时间继续学我的C#,虽然工作可能用C++比较多……(逃

欢迎交流

交流问题请在微信公众号后台留言,每一条信息我都会回复哈~






django2.1.5使用xadmin打造适合国人的后台管理系统

python做web开发的话,flask、django是比较火的框架了,django是一个比较大的框架,也是一个快速开发利器。但是,django自带的后台admin不太好看,也不太符合我们国人的习惯,因此一个基于bootstrap的后台xadmin诞生了,效果比较适合... 查看详情

django-rest-framework---总结(代码片段)

....drf框架安装2.接口3.restful接口规范4.基于restful规范的原生Django接口drf五大模块1.请求模块:request对象2.渲染模块:浏览器和Postman请求结果渲染数据的方式不一样3.解析模块4.异常模块5.响应模块序列化组件:1.Serializer2.序列化与反... 查看详情

django后台管理系统xadmin(代码片段)

目录Djangoxadmin介绍具体安装步骤django2.0.7版本下安装更高级的vueadminDjangoxadmin介绍Django是python的重量级web框架,写得少,做得多,非常适合后端开发,它很大的一个亮点是,自带后台管理模块,但它自带的后台管理有点丑,而Xadmin是基于boot... 查看详情

如何覆盖 django rest 框架( DRF )中的响应类?

】如何覆盖djangorest框架(DRF)中的响应类?【英文标题】:howoverwriteResponseclassindjangorestframework(DRF)?【发布时间】:2019-05-2310:43:07【问题描述】:我想覆盖djangorest框架的Response类,以便响应返回响应字典包含三个参数message、status... 查看详情

drf入门规范(代码片段)

DRF简介DjangoRest_Framework"""核心思想:缩减编写api接口的代码DjangoRESTframework是一个建立在Django基础之上的Web应用开发框架,可以快速的开发RESTAPI接口应用。在RESTframework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化... 查看详情

django开发博客系统(11-使用xadmin)(代码片段)

...置. 安装pipinstallhttps://codeload.github.com/sshwsfc/xadmin/zip/django2在base.py中配置INSTALLED_APPS1INSTALLED_APPS=[2...3‘xadmin‘,4‘crispy_forms‘,5‘reversion‘,6...7]接下来尝试创建迁移,会报一连串的错误,接下来一个个解决.我的开发环境是:python3.8... 查看详情

利用xadmin快速搭建后台管理系统(代码片段)

环境:python3.5.2,django2.0,xadmin2.0Firsttly到https://github.com/sshwsfc/xadmin/tree/django2上下载源码,之后把其中的xadmin目录放在项目目录中新建的extra_apps这个目录中 Secondly将extra_appsmarkassourceroot,然后在settings中将其导入到python的 查看详情

Django/DRF - 405 方法不允许删除操作

】Django/DRF-405方法不允许删除操作【英文标题】:Django/DRF-405MethodnotallowedonDELETEoperation【发布时间】:2014-12-2923:24:40【问题描述】:我正在本地机器(node和django)上使用两台开发服务器。我已将django-cors-headers添加到项目中,以允... 查看详情

使用drf和flask写注册模块差异总结(代码片段)

...很菜。写总结只是为了增加经验! 先说说个人flask和django框架的使用感受用flask写了用户模块第三方扩展自己找包django则不同了。django真的太大了。。 你如果真的用django去开发一个中小型项目那你感觉真的是杀鸡用牛刀... 查看详情

django&drf重点内容汇总(代码片段)

 Django&DRF重点内容大盘点  本文只是将学习过程中需要深刻记忆,在工作中常用的一些命令或者知识点进行一个罗列并阐释,不会全面的将所有内容进行讲解。大家可以在了解了Django框架和DRF框架之后再来看这边文章。... 查看详情

django+xadmin打造在线教育平台(代码片段)

Django+xadmin打造在线教育平台(十) 代码github下载十四、xadmin的进阶开发14.1.权限管理(1)用户权限超级用户拥有所有权限,其它添加的用户默认没有任何权限进后台添加一个用户“Editor1”,勾上“职员状态”后,这个用户才... 查看详情

为 DRF、Django 和 React 前端配置 Nginx 和 Gunicorn

】为DRF、Django和React前端配置Nginx和Gunicorn【英文标题】:ConfiguringNginxandGunicornforDRF,DjangoandReactFrontend【发布时间】:2019-07-2514:37:22【问题描述】:我有一个应用程序,它的前端在React中,后端在Django中,前端使用DRF开发的API。现... 查看详情

django都有哪些特点?

django一个相当全能的web框架。首先它集成了MVC和ORM这些技术。很有意思的是它严格遵循MVC的模式,但它和平时我们用的MVC很不同,它自已有一套MTV(model-view-template)的模式.要说django的特点一时间真没认真的和其它框架做比较。... 查看详情

django入门与实践课程系列第1篇

...ML语言3.了解浏览器上网的基本原理二、课前准备1.什么是Django1)Django官网地址:www.djangoproject.com2)Django是一个基于Python的高级Web开发框架3)它能够让开发人员进行高效且快速的开发4)高度集成(不用自己造轮子),免费并且... 查看详情

2.drf入门(代码片段)

drf介绍DjangoRESTframework(简称:DRF)是一个强大而灵活的WebAPI工具。遵循RESTFullAPI风格,功能完善,可快速开发API平台。官网文档:https://www.django-rest-framework.orgDjangoRESTframework最新版使用要求:Python(3.6、3.7、3.8、3.9、3.10)Django(2.2、3.0、3.1... 查看详情

django-cors-headers 不适用于 DRF(Django Rest 框架)

】django-cors-headers不适用于DRF(DjangoRest框架)【英文标题】:django-cors-headersdontworkwithDRF(DjangoRestFramework)【发布时间】:2019-01-0909:52:00【问题描述】:我正在尝试将django-cors-headers添加到我的djangorestAPI以在响应对象中添加HTTP标头Acc... 查看详情

什么是django?

Django是用Python开发的一个免费开源的Web框架,提供了许多网站后台开发经常用到的模块,使开发者能够专注于业务部分。并且囊括的Web应用部分可以用于快速搭建高性能、优雅的网站。并且提供了通用Web开发模式的高度抽象,通... 查看详情

python测试开发django-41.crispy-forms设计标签式导航菜单(tabholder)(代码片段)

...n的html页面是用的Bootstrap3框架设计的,layout布局用到的是django-crispy-forms框架,本篇详细讲下django-crispy-forms的官方文档案例django-crispy-forms当我们使用xadmin后台的时候,在INSTAL 查看详情