本文根據(jù)慕課網(wǎng)Djiango學(xué)習(xí)視頻學(xué)習(xí)。
前言:發(fā)現(xiàn)學(xué)習(xí)的東西,一段時間沒有用,就又忘記了,迷迷糊糊的。不行的寫下來,做個記錄。
該文很大部分參考了慕課網(wǎng)django的學(xué)習(xí)視頻。
項目創(chuàng)建開發(fā)流程
在相關(guān)環(huán)境搭建好之后,使用pycharm新建項目。方便快捷。
1.創(chuàng)建虛擬環(huán)境
目的就是每個項目的使用的包分開,如果不用虛擬環(huán)境,每個項目的三方包都安裝在同一個環(huán)境下,增大體積
1.安裝 virtualenv

2.在指定的目錄創(chuàng)建虛擬文件目錄

3.進入創(chuàng)建的目錄下的Scripts執(zhí)行activete.bat

進入虛擬環(huán)境。pip list 查看安裝的庫

退出執(zhí)行 deactivate.bat
用pychorm創(chuàng)建項目的時候,就選擇這個環(huán)境
2.創(chuàng)建項目,并觀察目錄
django-admin startproject myblog
創(chuàng)建項目.以下是初始化的項目結(jié)構(gòu)。

WSGI: Python服務(wù)器網(wǎng)管接口(不修改)
URLS:配置URL
Setting:(核心部分)
3.1創(chuàng)建App應(yīng)用
在pycharm中,也能生成app>tooks>

輸入 命令 startapp “名字” 就能生成app模塊

一些細節(jié)注意
創(chuàng)建static 目錄用于存放靜態(tài)html文件
。需要在setting中設(shè)置引用靜態(tài)文件的配置
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
創(chuàng)建log目錄用于存放log日志
因為涉及到存放文件 所以創(chuàng)建 media目錄。
重點:
后面可能有多個app,所以創(chuàng)建apps目錄,把app名字拖入.會自動創(chuàng)建init.py
把app名字 mark成sorcuess.。在setting 設(shè)置 才能識別sys.path.insert(0, os.path.join(BASE_DIR, "apps"))
應(yīng)用目錄
migrations 數(shù)據(jù)遷移模塊
admin.py 后臺管理系統(tǒng)配置
apps.py 當(dāng)前應(yīng)用的一些配置。沒什么意思
models.py 數(shù)據(jù)模塊 (ORM)
test.py 自動化測試,測試腳本
views.py 執(zhí)行響應(yīng)的邏輯代碼(重要)
3.3修改端口號
python manage.py runserver 9090
3,3.開啟服務(wù):
CMD窗口下該目錄下 python manage.py runserver
此時可以在瀏覽器打開改地址。顯示正確就說明成功了。
==================
創(chuàng)建第一個界面:
UR分發(fā),都要傳遞一個request對象,
在views.py中編輯
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world").
Urls配置的優(yōu)化,由于項目越來越大。在blog 應(yīng)用中創(chuàng)建urls 配置url后綴
提示,新版的django,在url中不用r這些正則

如果存在多個app了,可以在每個app下設(shè)置urls,并使用include來()導(dǎo)入

這樣子整個請求地址為

3.3模板的創(chuàng)建,什么是template
HTML文件,模板語言 DTL
3.4創(chuàng)建模板
1.在APP 的根目錄下,即blog下創(chuàng)建 templates的目錄
在該目錄下創(chuàng)建HTML代碼,index.html文件
在views.py中返回一個render()
render(reuest,"*.html",字典)
該字典是后臺傳遞到模板的參數(shù),鍵為參數(shù)名

def login(request):
return render(request, 'index.html', {"hello": "我是蒲小帥"})
在index.html中獲取
<h1>{{hello}}</h1>就能獲取到我是蒲小帥
****注意
Django按照InSTALLED_APPS的添加順序查找Templates,不同APP下Templates目錄下的同名.html會造成沖突
解決方法:
在templates目錄下創(chuàng)建于app目錄相同的文件夾,并將html文件放在其中。
3.5models介紹
在生成app應(yīng)用目錄時,自動為我們創(chuàng)建了models.py,并引入models

有了model,把其生成為數(shù)據(jù)表
3.6生成數(shù)據(jù)表
1.python manage.py makemigrations app(名) 可選,不寫的話,該應(yīng)用所有的都生成數(shù)據(jù)遷移。
2.python manage.py migrate

3.查看sql的語句 python manage.py sqlmigrate blog 0001

關(guān)聯(lián)MySql數(shù)據(jù)庫
在setting.py中修改,前提是已經(jīng)創(chuàng)建了數(shù)據(jù)庫

過程中提示沒有數(shù)據(jù)庫驅(qū)動,就要到虛擬環(huán)境中安裝。

到mysqlclient下載 mysqlclient-1.3.10-cp34-cp34m-win_amd64.whl。放到 虛擬環(huán)境錄下。用pip install 解壓他。
然后在客戶端,使用。
生成默認數(shù)據(jù)表

在app下的model中創(chuàng)建類來操作數(shù)據(jù)字段。
比如:

然后mannager.py 先執(zhí)行 makemigrations messages,在執(zhí)行 makemigrations message這是app名字。
migrate message進行查看過程。在navatat中可以看到默認創(chuàng)建djiaogo_message的表,以及字段

常用數(shù)據(jù)類型
models.ForeignKey
models.DateField
models.IntegerField
models.IPAddressField
models.FileField
models.ImageField


創(chuàng)建超級賬戶
createsuperuser

xadmin
比admin界面更友好
推薦github上下載源碼,使用django2分支,解壓復(fù)制xadmin目錄到app同級目錄下??赡苡邢嚓P(guān)內(nèi)容沒導(dǎo)入,用pycharm自行導(dǎo)入解壓。
在setting.py中添加
INSTALLED_APPS = [
# 'django.contrib.admin',
'xadmin',
'crispy_forms',注意這里有個逗號
]
導(dǎo)入 xadmin
,url中設(shè)置xamin

xadmin一些配置
1.配置主題,在user.admin中設(shè)置
class BaseSeting(object):
enable_themes=True
use_bootswatch=True
xadmin.site.register(views.BaseAdminView,BaseSeting)
必寫在最后注冊不能寫在第一位。不然估計初始化錯誤。
class GlobalSettings(object):
site_title="后臺管理系統(tǒng)" #左上角文字
site_footer="@蒲小帥"#下方文字
menu_style="accordion" #設(shè)置菜單為收縮
xadmin.site.register(views.CommAdminView,GlobalSettings)
設(shè)置菜單顯示為中文,也就是app下面的文字
1.在相應(yīng)的app(operation)的app.py下添加 verbose_name="用戶操作"
2.2,在init下寫 default_app_config="operation.apps.OperationConfig"
前端uiSemantic-UI
繼續(xù)學(xué)習(xí)
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
urls中參數(shù)傳遞,
def hello(request,name):
name="你好,%s" %name
return HttpResponse(name)\
...
path('hello/<name>',views.hello)

帶?/?name就需要用get
def hi(request):
name=request.GET.get("name")
return HttpResponse("你好,"+name)
...
path('hi/',views.hi)

url命名,反轉(zhuǎn)url

比如 在redirect('/cms/'),需要改變的時候,需要改很多地方,那么我們就給他取個名字,就算地址變了,名字沒變。
第一步:path('hi/',views.hi,name="login")
第二步: from django.shortcuts import redirect,reverse
redirect(reverse('login'))
命名空間
cms,front中的urls的path的名稱name都一樣,重復(fù)了,那么在views中就不知道找誰。在多個app之間,可能產(chǎn)生同名的url,反轉(zhuǎn)就會混淆
在各自的urls中,指定
app_name='front'
....
反轉(zhuǎn)的地方
reverse('front.login')
模板引擎
falsk jinjia2 django DTL模板引擎
兩種渲染方式:
1.render_to_string
def index(request):
html=render_to_string('index.html')
return HttpResponse(html)
2.render
return render(request,'index.html')
模板路徑設(shè)置
‘DIRS’,查找路徑,是個列表可設(shè)置多個,
‘APP_DIRS’=true,如果在DIRS下沒找到,優(yōu)先在當(dāng)前app中尋找,找不到會在安裝了的app中看有沒有teamplates。(INSTALLED_APPS下,添加‘a(chǎn)pp’)
模板變量,語法,if,for
DTL常用過濾
add 把數(shù)據(jù)轉(zhuǎn)成int,在跟value進行相加
{{value|add:"2"}}
flask {{ url_for('xxx',xxx='')}}
cut
{{value | cut :" "}} 剪掉空格
相當(dāng)于 replace(args,"")
date
{{birthday | date:''Y/m/d"}}
2018/12/27
模板繼承
{% extends 'xxx'%}
{% block body%}
{% endblock%}
跟flask一樣
{{block.super}}繼承父模板
{% url 'xxx'%}
加載靜態(tài)文件

'builtins':['django.templatetags.static']
#不與app下的static相關(guān)
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]