既然是快速开发,那废话很少说,直接说步骤:html
通过这些步骤就能获得一个具有完整的后端接口和后台管理界面的网站了,若是写了template的话还能把前端的工做也作了。前端
接下来按照上面提到的顺序记录一下个人开发实践。vue
好像没啥好说的,Django3多了几个新的特性,能够用class来定义choices,这个比之前的元组定义方便一些,其余的好像没什么了,对了,定义ManyToMany最好设置一个related_name,方便之后在代码里作反向查询。python
这个很简单,只要告诉框架你须要序列化model的哪一个字段就行了。
官方文档:https://www.django-rest-framework.org/tutorial/1-serialization/git
代码例子以下:github
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代码:shell
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
就是把queryset和serializers关联起来。django
贴一下代码,对应上面的student的serializers。bootstrap
from rest_framework import viewsets from .models import * from .serializers import * class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer
能够理解为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的简单参考文档:
其实这一步也能够放在前面,就是刚定义完models的时候就配置,这样方便管理数据。
Django自带的这个admin能够说很强大了,能够省去不少中小型网站的管理后台开发工做,不过默认的界面是比较丑的,这个用过的人都懂,可是又想用,怎么办?因此要进行美化啊,之前我只知道xadmin这个库,国人开发的,基于bootstrap3界面,重写了整套admin代码,界面好看了很多,无奈有不少bug,文档又几乎是没有的,不少功能实现都只能去看代码,体验极差,严重影响开发效率……(可是为了界面好看我一开始仍是只能用这个了)
关于Django配置详情能够看刘江大大的博客,很详细,在我下面的第一个参考连接里面~
界面效果大概这样:
而后我又发现了一个新的xadmin替代品,叫simpleui,号称vue+element ui写的,界面也不错,实际体验嘛,emmm……和xadmin互有千秋。不过这货搞了个pro版本,也就是付费版,因此开源免费版这个能用就偷着乐了,你懂的。
界面以下,还能够换主题。
有兴趣请看看官方github:https://github.com/newpanjing/simpleui
如今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的配置和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秒
class LessonInline(object): model = Lesson extra = 0 class CourseResourceInline(object): model = CourseResource extra = 0
data_charts = { "user_count": {'title': u"course_num", "x-field": "addtime", "y-field": ("course_num"), "order": ('addtime',) } }
效果这样:
为啥要覆盖?固然是要自定义一些操做啊,好比你要保存用户信息的时候验证某些字段,经过才给保存,不经过就给出提示,咋搞,覆盖父类函数呀!
代码例子:
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++比较多……(逃
交流问题请在微信公众号后台留言,每一条信息我都会回复哈~