前言css
好朋友陳道遠是個愛漂亮的人,就算裸奔也是把本身洗的白白的,老是想着裝飾本身,他天天出門都要打扮本身,但是在每次都會進行不少重複的東西,這時候他來問李陽,李陽告訴他至於要把重複的動做製做一個套,每次出去帶上套,只要添加今天須要的東西就好,爲了感謝李陽,他就和李陽一塊兒唱起了拼刺刀,他誇讚李陽厲害,到胃了,他走的時候問李陽要朵花,李陽告訴他,:你送來的菊花,我已經讓他變成了玫瑰! 本節來說Django中的裝飾器,沒有萬能的道遠,可是有萬能的點.
Django的視圖函數viewhtml
request對象前端
就是從前端打交道的關鍵字 models是與數據庫打交道的關鍵字 這是最通俗易懂的理解
respanse對象python
render 回覆html頁面 redirect 重定向 HttpResponse 回覆字符串
裝飾器:數據庫
def func(f): def inner(request): print("被裝飾前") ret=f(request) print("被裝飾以後") return ret return inner #在FBV模式下,和普通函數加裝飾器是同樣的寫法 @func def hong(request): print('home') return HttpResponse('你好,老闆,,,,要多少錢的') CBV加裝飾的三個姿式: # @method_decorator(func,name='get') 位置3 class LoginView(View): # @method_decorator(func) #位置2 def dispatch(self, request, *args, **kwargs): print('aaaa') ret = super().dispatch(request, *args, **kwargs) #render(request, 'login.html') print('bbbb') return ret @method_decorator(func) #位置1 def get(self,request): print('this is get method!!!') return render(request, 'login.html') def post(self,request): uname = request.POST.get('username') pwd = request.POST.get('password') if uname == 'alex' and pwd == 'dsb': return redirect('/home/') else: return redirect('/login/')
FBV:function based view 基於函數的視圖函數 例子: def login(request): if request.method=='GET': return render(request,'login.html') else: user=request.POST.get('username') pwd=request.POST.get('password') if user=='alex' and pwd=='dsb': return redirect('/home/') else: return render(request,'login.html') # 路經: url(r'^login/', views.Login),
CBV:class based view 基於類的視圖函數 例子: from django.views import View class LoginView(View): def get(self,request): return render(request, 'login.html') def post(self,request): uname = request.POST.get('username') pwd = request.POST.get('password') if uname == 'alex' and pwd == 'dsb': return redirect('/home/') else: return redirect('/login/') 路經: url(r'^login/', views.LoginView.as_view()),
模板渲染django
{{變量}} {%邏輯%}
<h1>{{nam}}</h1> <h1>{{s}}</h1> <h1>{{11.1}}</h1> <h1>{{d1.number}}</h1> <h1>{{a.yue}}</h1> <h1>{{a.xx}}</h1> view.py的寫法 def home(request): num = 100 s = 'hello my girl I love you' l1 = [11,22,33] d1 = {'name':'冠希哥','number':1000} class A: balance = 2000 def __init__(self): self.xx = 'oo' def yue(self): return 'how much!' a = A() # render({'xx':'oo'}) return render(request,'home.html',{'num':num,'s':s,'l1':l1,'d1':d1,'a':a})
靜態函數配置bootstrap
過濾器用法 {{ 變量|過濾器名稱:'參數' }} ,不是全部過濾器都有參數,若是沒參數的話寫法:{{ 變量|過濾器名稱 }}
<h1>{{ s|truncatechars:n }}</h1> 過濾器裏面的參數均可以寫後端返回的變量 default -- <h1>{{ xx|default:'抱歉,沒有數據!!' }}</h1> #默認值 length -- <h1>{{ l1|length }}</h1> 獲取變量數據長度 filesizeformat -- <h2>{{ file_size|filesizeformat }}</h2> #大小按照人類可讀的顯示 slice -- <h2>{{ s|slice:'0:7' }}</h2> #切片 顧頭不顧腚 date: -- <h3>{{ now|date:'Y-m-d H:i:s' }}</h3> #日期格式化顯示 safe -- <h1>{{ a_tag|safe }}</h1> 數據: a_tag = "<a href='http://www.baidu.com'>百度</a>" safe介紹 Django的模板中在進行模板渲染的時候會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全,django擔憂這是用戶添加的數據,好比若是有人給你評論的時候寫了一段js代碼,這個評論一提交,js代碼就執行啦,這樣你是否是能夠搞一些壞事兒了,寫個彈窗的死循環,那瀏覽器還能用嗎,是否是會一直彈窗啊,這叫作xss攻擊,因此瀏覽器不讓你這麼搞,給你轉義了。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。 truncatechars -- <h1>{{ s|truncatechars:'6' }}</h1> join -- <h1>{{ l1|join:'+' }}</h1>
url斜槓後端
url(r'^home/', views.home), #前置導航斜槓不須要寫,後面的斜槓是根據django的配置來的,若是在settings配置文件中咱們設置了 # APPEND_SLASH = False,那麼瀏覽器發送來的請求若是沒有帶着後面的斜槓,也是能夠正常請求的,可是若是沒有這個配置的話,django要求瀏覽器必須帶着路徑後面的斜槓來進行訪問,若是你輸入路徑的時候沒有加/,那麼django讓你的瀏覽器發一個重定向請求帶上/.
靜態文件配置瀏覽器
在項目中,其實js\css\jgp圖片等等都稱爲靜態文件. 在django中的使用 1 配置,在settings配置文件中寫上如下配置 STATIC_URL = '/static/' #127.0.0.1:8000/static/bootstrap/css. STATICFILES_DIRS = [ os.path.join(BASE_DIR,'jingtaiwenjianjia'), ] 2 html文件中使用 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"> 相對路徑引入靜態文件時,前置斜槓必須加上,無論是什麼,a標籤也是同樣,相對路徑訪問,必須前面的斜槓
from django.views import View class book_list(View): def get(self,request): all_books = models.Book.objects.all() # 對象列表 return render(request, 'book_list.html', {'all_books': all_books}) class book_del(View): def get(self,request): pk = request.GET.get('id') models.Book.objects.filter(pk=pk).delete() return redirect('/book_list/') class book_add(View): def get(self,request): return render(request, 'book_add.html') def post(self,request): book_name = request.POST.get('book_name') book_price = request.POST.get('book_price') publisher_name = request.POST.get('publisher_name') publish_time = request.POST.get('publish_time') if models.Book.objects.filter(book_name=book_name): error = '書名已經存在' else: models.Book.objects.create(book_name=book_name, book_price=book_price, publisher_name=publisher_name, publish_time=publish_time) return redirect('/book_list/', {'error': error}) class book_edi(View): def get(self,request): pk = request.GET.get('id') book_obj = models.Book.objects.filter(pk=pk).first() return render(request, 'book_edi.html', {'book_obj': book_obj}) def post(self,request): pk = request.GET.get('id') book_obj = models.Book.objects.filter(pk=pk).first() book_name = request.POST.get('book_name') book_price = request.POST.get('book_price') publisher_name = request.POST.get('publisher_name') publish_time = request.POST.get('publish_time') book_obj.book_name = book_name book_obj.book_price = book_price book_obj.publisher_name = publisher_name book_obj.publish_time = publish_time book_obj.save() return redirect('/book_list/') def reserch(request): ret = models.Book.objects.all().first() print(ret) return render(request,'reserch.html',{'ret':ret})