Django中的裝飾器和萬能的點

前言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})
相關文章
相關標籤/搜索