Django-views視圖函數-template模板語法

視圖函數

經常使用的http請求有兩種,一種是get,一種是posthtml

在django的views.py中,咱們處理客戶端的請求:python

咱們定義url映射過來的視圖函數,接受請求參數request(請求對象)數據庫

def login(request):
    if request.method=="POST":
        print("GET",request.GET)#根據不一樣的請求方式,咱們可使用不一樣的request的方法進行取值
        print("POST",request.POST)#request.POST 獲取的是一個字典,經過get(key)獲取對應的值
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        
        return HttpResponse("登錄成功!")
    
    return render(request,"login.html")

對於表單中的複選框checkbox、多選select 的請求的取值方式django

request.POST查看下獲取的字典安全

request.POST.getlist(「hobby」)獲取字典中多個值cookie

一些經常使用語法

其餘使用方式
             request(請求對象):
                request.GET       {}     get請求數據
                request.POST      {}     post請求數據
                request.POST.getlist()
                request.method           請求方式,用於判斷
                request.path             請求路徑用於獲取
                request.get_full_path()  請求全路徑

HTTPrequest的對象

屬性session

'''
path:       請求頁面的全路徑,不包括域名

method:     請求中使用的HTTP方法的字符串表示。全大寫表示。例如

               if  req.method=="GET":

                         do_something()

               elif req.method=="POST":

                         do_something_else()

GET:         包含全部HTTP GET參數的類字典對象

POST:       包含全部HTTP POST參數的類字典對象

COOKIES:     包含全部cookies的標準Python字典對象;keys和values都是字符串。

FILES:      包含全部上傳文件的類字典對象;FILES中的每個Key都是<input type="file" name="" />標籤中
             name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys:

             filename:      上傳文件名,用字符串表示
             content_type:   上傳文件的Content Type
             content:       上傳文件的原始內容


user:       是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前
             沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。你
             能夠經過user的is_authenticated()方法來辨別用戶是否登錄:
             if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
             時該屬性纔可用

session:    惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。

'''

 

response( 響應對象)

  •   HttpRequose()用於返回簡單的字符串
  •   render函數()返回模板
  •   redirect函數()路徑的重定向

render函數

render(request, template_name[, context]) 

結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
參數:
     request: 用於生成響應的請求對象。

     template_name:要使用的模板的完整名稱,可選的參數

     context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。

     content_type:生成的文檔要使用的MIME類型。默認爲DEFAULT_CONTENT_TYPE 設置的值。

     status:響應的狀態碼。默認爲200。

render實例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<h3>{{ l }}</h3>
<h3>{{ d }}</h3>
<h3>{{ s }}</h3>

<hr>
/* 模板中的循環方式*/
{% for i in PersionList %} <p>{{ i.age }},{{ i.name }}</p> {% endfor %} </body> </html>

 

#views.py
def index(request):
    s ="Wate"
    age = 18
    l = ["23","2333","3333"]
    d = {"hello":"wate","hello1":"haoms"}

    class Persion:
        def __init__(self,name,age):
            self.name=name
            self.age = age

        def dream(self):
            return "have dream"
    egon = Persion("egon",28)
    wate = Persion("wate",18)
    alex = Persion("alex",28)
    PersionList=[egon,wate,alex]
#下面render會將模板中的變量,對應context參數中的字典對應的值傳入模板中,可傳入整形,字符串,列表,字典,類
return render(request,"app01/index.html",{"s":s,"age":age,"l":l,"d":d,"PersionList":PersionList})

 

redirect函數

參數能夠是:
◾一個模型:將調用模型的get_absolute_url() 函數
◾一個視圖,能夠帶有參數:將使用urlresolvers.reverse 來反向解析名稱
◾一個絕對的或相對的URL,將原封不動的做爲重定向的位置。

默認返回一個臨時的重定向;傳遞permanent=True 能夠返回一個永久的重定向。

示例:


你能夠用多種方式使用redirect() 函數。

 

模板層

tempalte(模板層):
        
        功能: 爲了更有邏輯的將數據庫中的數據渲染到模板中
        
        模板語法     
              變量  {{ }}
            
                   深度查詢: 句點符 .
                   過濾器: {{var|filter_name:參數}}   
                   
            標籤  {% url %}  
                
                {% for i in obj %}    {% endfor %}        
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

/*變量*/
<h3>{{ l }}</h3>
<h3>{{ d }}</h3>
<h3>{{ s }}</h3>

<hr>
/*循環,類對象*/
{% for i in PersionList %} <p>{{ i.age }},{{ i.name }}</p> {% endfor %} </body> </html>

 

{% if %} 的使用

{% if num >= 100 and 8 %}

    {% if num > 200 %}
        <p>num大於200</p>
    {% else %}
        <p>num大於100小於200</p>
    {% endif %}

{% elif num < 100%}
    <p>num小於100</p>

{% else %}
    <p>num等於100</p>

{% endif %}



{% if %} 標籤接受and,or或者not來測試多個變量值或者否認一個給定的變量
{% if %} 標籤不容許同一標籤裏同時出現and和or,不然邏輯容易產生歧義,例以下面的標籤是不合法的:

{% if obj1 and obj2 or obj3 %}

 

csrf_token標籤

用於生成csrf_token的標籤,用於防治跨站攻擊驗證。 其實,這裏是會生成一個input標籤(標識身份),和其餘表單標籤一塊兒提交給後臺的。app

當咱們post請求時會出現403報錯,是因爲django的安全機制致使。函數

咱們註釋掉setting中的post

#'django.middleware.csrf.CsrfViewMiddleware',
就是爲了這個安全機制失效。
如今有了另外一種方式
咱們在post請求表單中添加{% csrf_token %}

 

 

模板語法變量過濾器

模板的過濾器就是模板中對變量進一步的作處理~

好比上面的例子,咱們須要在模板中對年齡增長10歲

就能夠寫成

在模板中對整型變量進行加操做
<h3> helllo {{ name }}--{{ age|add:10 }}</h3>

對日期變量進行格式化
<p>{{ date|date:"Y-m-d" }}</p>

default過濾器,當變量爲空時,設置默認值
<p>{{ l|default:"空變量" }}</p>

length過濾器,顯示有多少個元素
<p>{{ s|length }}</p>

filesizeformat過濾器
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ 12312321|format }}

切片過濾器,顧頭不顧尾,從第二個字符取到倒數第二個
{{ name|slice:"2:-1" }}

truncatechars過濾器,只顯示變量的9個字符以後跟省略號
{{ value|truncatechars:9 }}
{{ value|truncatewords:9 }}
safe
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。
可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,
後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,
若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,
若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。好比:
當變量爲標籤時 好比變量a_ele爲: <a href=''>點擊</a>
{{ a_ele|safa }}這種聲明爲安全的標籤,原生

 

自定義標籤和過濾器

一、在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.

二、在app中建立templatetags包(包名只能是templatetags)

三、建立任意 .py 文件,如:my_tags.py

 

from django import template
from django.utils.safestring import mark_safe
register = template.Library()   #register的名字是固定的,不可改變
#前三行固定

四、寫功能腳本

#須要使用register.filter裝飾器
@register.filter
#注意模板中只能接受兩個參數
def multi(x,y): return x*y

五、引入腳本(在html中使用功能的地方添加上)

{% load my_tags %} 
{{ n|multi:12 }}

使用方式,除了直接使用以外,還能夠用做模板中的判斷語句,和if一塊兒用

#只有過濾器能夠用,標籤不能夠
{% if n|multi:10 > 100 %}
<p>大與100</p>
{% else %}
<p>小於等於100</p>
{% endif %}

 

注意,新引入的過濾器須要重啓項目

自定義標籤

除了自定義過濾器以外,還有個類似的自定義標籤,與過濾器不一樣的地方在於

腳本中引用的裝飾器不一樣

咱們在mytag.py中寫入

@register.simple_tag #標籤
def multi(x,y):
#可接受任意個參數
return x*y

在html中引入方式

{% load my_tags %} 
{% multi_tag n 5 %}

filter和標籤 區別:

  一、自定義filter只能接受兩個參數

  二、自定義simple_tag不能與if使用

 

模板的繼承

一、建立母版

在須要替換的地方添加個盒子

引用時

一、繼承時extends必須是第一個標籤

二、追加時使用{{ block.super }}

  • 爲了更好的可讀性,你也能夠給你的 {% endblock %} 標籤一個 名字 。例如:

{% block content %}
...
{% endblock content %}

在大型模版中,這個方法幫你清楚的看到哪個  {% block %} 標籤被關閉了。

相關文章
相關標籤/搜索