步骤

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

  • 安装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/

代码例子如下:

  1. from .models import *
  2. from rest_framework import serializers
  3. class StudentSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = Student
  6. fields = ['name', 'gender', 'number', 'faculty', 'major', 'year']

附上这个Student的model代码:

  1. class Student(models.Model):
  2. name = models.CharField('姓名', max_length=10)
  3. gender = models.IntegerField('性别', default=1, choices=GenderChoices)
  4. number = models.CharField('学号', max_length=20, blank=True)
  5. faculty = models.CharField('学院', max_length=20, blank=True)
  6. major = models.CharField('专业', max_length=20, blank=True)
  7. year = models.CharField('届别', max_length=4)
  8. def __str__(self):
  9. return self.name

定义viewsets

就是把queryset和serializers关联起来。

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

  1. from rest_framework import viewsets
  2. from .models import *
  3. from .serializers import *
  4. class StudentViewSet(viewsets.ModelViewSet):
  5. queryset = Student.objects.all()
  6. serializer_class = StudentSerializer

配置router

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

代码:

  1. from rest_framework import routers
  2. from core import views
  3. router = routers.DefaultRouter()
  4. router.register('user', views.UserViewSet)

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

  1. urlpatterns = [
  2. path('admin/', admin.site.urls),
  3. path('api/', include(router.urls)), # 这里
  4. path('api-auth/', include('rest_framework.urls')), # 和这里
  5. ]

干净利索,这个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说的:

  1. 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,修改内容:

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

xadmin配置

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

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

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

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

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

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

admin类的属性详情

  • model_icon:图标用的是font awesome图标,不过这个网站国内好像访问不了,所以我们用国内版的网站替代,http://www.fontawesome.com.cn/icons-ui/
  • inlines的配置和Django的差不多,不过不能像Django一样集成xxxinline的父类……要定义的话参考下面的代码:
  1. class LessonInline(object):
  2. model = Lesson
  3. extra = 0
  4. class CourseResourceInline(object):
  5. model = CourseResource
  6. extra = 0
  • 还有一个图表功能,不过我觉得没啥用,主要是x坐标换成char字段就显示不出来了,很恶心,例子:
  1. data_charts = {
  2. "user_count": {'title': u"course_num", "x-field": "addtime", "y-field": ("course_num"),
  3. "order": ('addtime',)
  4. }
  5. }

效果这样:

admin类的一些方法覆盖

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

代码例子:

  1. class ExamineAdmin(BaseAdminObject):
  2. .......
  3. def save_models(self):
  4. # 获取保存的新对象
  5. obj = self.new_obj
  6. # 获取原来的对象,如果是创建新对象,则org_obj为空
  7. org_obj = self.org_obj
  8. if 不满足条件:
  9. self.message_user(message="不满足xxx条件", level='error')
  10. else:
  11. return super().save_models()

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

参考:

写在最后

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

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

欢迎交流

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

Django快速开发实践:Drf框架和xadmin配置指北的更多相关文章

  1. 基于django快速开发一个网站(一)

    基于django快速开发一个网站(一) *  创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...

  2. ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑

    上次搭建好了项目框架,但还是觉得不太对劲,后来才想起来没有对开发目标进行定位,这个小demo虽然不用做需求分析,但是要实现什么效果还得明确.后来想了一下就做个最简单的网站,目标定为小公司进行展示用的网 ...

  3. DRF框架 之基础配置

    Vue框架的总结 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 ...

  4. Android 快速开发系列 ORMLite 框架最佳实践

    比较靠谱的Helper的写法: 1.DatabaseHelper package com.zhy.zhy_ormlite.db; import java.sql.SQLException; impor ...

  5. Android 快速开发系列 ORMLite 框架最佳实践之实现历史记录搜索

    首先在build.gald中添加compile 'com.j256.ormlite:ormlite-android:4.48'的引用 compile 'com.j256.ormlite:ormlite ...

  6. Django博客开发教程,Django快速开发个人blog

    学DjangoWEB框架,估计大部分的朋友都是从Blog开发开始入门的,Django中文网发布了一个Django开发教程,这个教程简单易懂,能让你快速的使用Django开发一个漂亮的个人blog,是D ...

  7. Django快速开发之投票系统

    https://docs.djangoproject.com/en/1.8/intro/tutorial01/ 参考官网文档,创建投票系统. ================ Windows  7/1 ...

  8. Django快速开发投票系统

    使用Django搭建简单的投票系统:这个是官网的教程:https://docs.djangoproject.com/en/2.0/intro/tutorial01/ 在Run manage.py Ta ...

  9. Java开发实践 集合框架 全面分析

    http://www.open-open.com/lib/view/open1474167415464.html

随机推荐

  1. 第四届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.世纪末的星期 题目描述 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日, ...

  2. 【PHP】如何将SESSION数据存放到Redis中

    在php中,SESSION的数据默认是存放到文件中,这样性能不仅不高,而且不利于扩展.在搭建集群后,默认存放到文件中就不适用了.所以,我们一般将SESSION自定义,让SESSION中的数据存放到 数 ...

  3. filebeat v6.3 如何增加ip 字段

    我们知道filebeat获取数据之后是会自动获取主机名的,项目上有需要filebeat送数据的时候送一个ip字段出来 方法:配置filebeat配置文件 解释一下:field 是字段模块 在这个模块下 ...

  4. ORM框架 Mybatis、Hibernate、Spring Data JPA之到底该用谁,谁更牛*

    在持久层框架中无可厚非的就是mybatis了,但是也会经常被人问到为啥要用mybatis,为啥不用hibernate,jpa.很多人各级都是地铁爷爷看手机的表情,似乎从来没想过这个问题.“公司叫用我就 ...

  5. CentOS8.1安装Docker及Docker-compose

    使用 Docker 仓库进行安装 在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库.之后,您可以从仓库安装和更新 Docker. 设置仓库 安装所 ...

  6. excel如何快速统计出某一分类的最大值?

    问题:如何统计出某一分类的最大值? 解答:利用分类汇总或透视表快速搞定! 思路1:利用分类汇总功能 具体操作方法如下: 选中数据区任意一个单元格,然后点击“数据-分类汇总”按钮.(下图 1 处). 在 ...

  7. spark源码解析大全

      第1章 Spark 整体概述 1.1 整体概念   Apache Spark 是一个开源的通用集群计算系统,它提供了 High-level 编程 API,支持 Scala.Java 和 Pytho ...

  8. 厉害了!除了find命令,还有这么多文件查找命令,高手必备!

    大家好,我是良许. 在系统里查找文件,是所有工程师都必备的技能(不管你用的是 Windows .Linux.还是 MacOS 系统).对于 Linux 操作系统,单单一个 find 命令就可以完成非常 ...

  9. 一文梳理JavaScript中的this

    最近零零碎碎看了许多关于this的文章,本着"好记性不如烂笔头"的思想,特在这里整理一下this有关的知识点.[长文警告!!!] 接下来,笔者将按照以下目录对this进行阐述: t ...

  10. SLS编写规范

    SLS编写规范 规范要点说明 首先,状态的执行不可回滚,执行完了就是执行完了,并不会中断回滚,其次,状态的执行,可以反复执行,也就是说一个状态文件,可以多次来进行调用. 在编写状态文件过程中,有以下几 ...