既然是快速開發,那廢話很少說,直接說步驟: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++比較多……(逃
交流問題請在微信公衆號後臺留言,每一條信息我都會回覆哈~