Django 學習 之 模板(html)與配置靜態文件

 一.模板(html)

1.模板語法之變量:語法爲 {{ }}

Django 模板中遍歷複雜數據結構的關鍵是句點字符, 語法:{{ var_name }}css

var_name 是一個變量名稱,須要和views文件return第三個參數(字典)中的鍵一一對應。html

views.py中的內容:python

 

def index(request):jquery

    # 變量裏的變量名等於return中的值,return的鍵要也模板{{ }}的一一對應數據庫

    s = "hello"  # 一個變量django

    list1 = ['one', 2, "three"]  # 列表bootstrap

    dict1 = {"name": "zero", "age": 18, "sex": ""}  # 字典緩存

 

    class Person(object):安全

        def __init__(self, name):數據結構

            self.name = name     # 類中的屬性

 

        def eat(self):           # 類中的方法

            return "%s特別能吃" % self.name

 

    person_ming = Person("ming")  # 自定義類對象

    person_hu = Person("hu")

    person_xing = Person("xing")

 

    person_list = [person_ming, person_hu, person_xing]

 

    return render(request, "index.html", {

        "snum": s,

        "list": list1,

        "dict": dict1,

        "person_ming": person_ming,

        "person_list": person_list,

    })

 

templates下的index.htmlbody的內容:

 

<body>

<h1>哈哈哈哈</h1>

<hr>

<h2>一個變量:{{ snum }}</h2>

<hr>

<p>一個列表:{{ list }}</p>

<p>列表中的元素獲取第一個值:{{ list.0 }}</p>

<p>列表中的元素獲取第二個值:{{ list.1 }}</p>

<hr>

<p>一個字典:{{ dict }}</p>

<p>字典中的值:{{ dict.name }}</p>

{% for key,val in dict.items %}

    <p>{{ key }}:{{ val }}</p>

{% endfor %}

<hr>

<p>顯示的是一個對象:{{ person_ming }}</p>

<p>顯示的是一個對象中的屬性:{{ person_ming.name }}</p>

<p>顯示的是列表對象:{{ person_list }}</p>

<p>顯示列表對象中的第一個對象:{{ person_list.0 }}</p>

<p>顯示列表對象中的第二個對象的屬性:{{ person_list.0.name }}</p>

<p>顯示對象中的方法:{{ person_list.0.eat }}</p>

{#注意對象中的方法調用在模板中不須要(),和屬性相同便可被調用#}

</body>

 

注意:句點符也能夠用來引用對象的方法

如:

<h4>字典:{{ dict.name.upper }}</h4>

2.模板語法之過濾器:語法 {{obj|filter__name:param}}

語法:{{obj|filter__name:param}}  #param能夠有也能夠沒有

(1)default

若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。特別注意True也直接顯示爲True

(2)length

語法:{{ value|length }}

返回值的長度。它對字符串和列表都起做用。

(3)filesizeformat

語法:{{ value|filesizeformat }} 

value只能一個數值,其餘類型的值沒法讀取默認:     

將值格式化爲一個人類可讀的文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:

若是 value 123456789,輸出將會是117.7 MB

(4)date

語法:{{ value|date:"Y-m-d" }} 

根據給定的格式日期格式。

若是 now=datetime.datetime.now()

會輸出:2019-07-04 的格式

還有別的時間格式輸出:

{{ value|date }}

{{ value|date:"D d M Y" }}

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

(5)truncatechars

語法:{{ value|truncatechars:10 }}

若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(...」)結尾。

參數:要截斷的字符數

(6)safe

Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。

語法:{{ value|safe }}

 

以上的例子爲下內容:

views.py內容爲:

def model_filter(request):

    name1 = "hsz"

    str_length = "I love three things. The sun ,the moon and you. " \

                 "The sun for the day. The moon for the night and you forever."

    num = 12345

 

    value = "<a href='http://www.baidu.com'>點擊</a>"

    import datetime

    now = datetime.datetime.now()

    return render(request,"filter.html",{

        # (1)default

        "name01": name1,

        "name02": False,

        "name03": '',

        "name04": True,

        # (2)length

        "str_lg": str_length,

        # (3)filesizeformat

        "str_fileszie": str_length,

        "num_filesize": num,

        # (4)date

        "now": now,

        # (5)truncatechars

        "str_truncate": str_length,

        # (6)safe

        "sf_value": value,

 

})

 

 

相應的filter.htmlbody內容爲:

<body>

<p>(1)default</p>

<p>{{ name01|default:"zero"}}</p>

<p>{{ name02|default:"zero"}}</p>

<p>{{ name03|default:"zero"}}</p>

<p>{{ name04|default:"zero"}}</p>

<hr>

<p>(2)length</p>

<p>{{ str_lg|length }}</p>

<hr>

<p>(3)filesizeformat</p>

<p>{{ str_fileszie|filesizeformat }}</p>

<p>{{ num_filesize|filesizeformat }}</p>

<hr>

<p>(4)datetime</p>

<p>{{ now|date }}</p>

<p>{{ now|date:"Y-m-d" }} </p>

<p>{{ now|date:"D d M Y" }}</p>

<p>{{ now|date:"D d M Y" }} {{ now|time:"H:i" }}</p>

<hr>

<p>(5)truncatechars</p>

<p>截取50個字符</p>

<p>{{ str_truncate|truncatechars:50 }}</p>

<hr>

<p>(6)safe</p>

<p>{{ sf_value|safe }}</p>

</body>

 

3.模板語法之標籤:語法爲 {% tag  %}

標籤看起來像是這樣的: {% tag %}。標籤比變量更加複雜:一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤 (例如{% tag %} ...標籤 內容 ... {% endtag %})。

(1)for標籤

a.遍歷每個元素

{% for pername in per_list %}

    <p>名字爲:{{ pername}}</p>

{% endfor %}

<hr>

<p>for的反向循環</p>

{% for name in per_list reversed %}

    <p>倒敘的名字爲:{{ name }}</p>

{% endfor %}

 

b.遍歷一個字典

<p>遍歷一個字典</p>

<p>一我的的信息:</p>

{% for key,val in info_dict.items %}

    <p>{{ key }}:{{ val }}</p>

{% endfor %}

 

注:循環序號能夠經過{{forloop}}顯示

例:

<p>序號從1開始</p>

{% for i in loop_list %}

    <p>{{ forloop.counter }}:{{ i}}</p>

{% endfor %}

 

序號從1開始

<p>{{ forloop.counter }}:{{ i.name }} === {{ i.eat }}</p>

序號從0開始

<p>{{ forloop.counter0 }}:{{ i.name }} === {{ i.eat }}</p>

 倒序

<p>{{ forloop.revcounter }}:{{ i.name }} === {{ i.eat }}</p>

倒序,最後一個爲0

<p>{{ forloop.revcounter0 }}:{{ i.name }} === {{ i.eat }}</p>

 

例:(forloop.first):

{% for i in loop_list %}

 {% if forloop.first %}

    {{i}}

 {% endif %}

{% endfor %}

 

(forloop.last)2

{% for i in loop_list %}

{% if forloop.last %}

    {{ i }} <--這是最後一個數

{% else %}

   {{ i }}|

{% endif %}

{% endfor %}

 

(2)for ... empty

for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。

:

{% for num in em_list %}

    <p>{{ num }}</p>

{% empty %}

    <p>sorry,no num here</p>

{% endfor %}

(3)if 標籤

{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。

{% if num > 100 or num < 0 %}

    <p>無效</p>

{% elif num > 80 and num < 100 %}

    <p>優秀</p>

{% else %}

    <p>湊活吧</p>

{% endif %}

(4)with 標籤

使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個昂貴的方法(好比訪問數據庫)不少次的時候是很是有用的。(就至關於把值暫時保存)

<p>{{ per_list.2 }}</p>

{% with name=person_list.2 %}

    <p>{{ name }}</p>

{% endwith %}

(5)csrf_token

提交數據的時候就會作安全機制,當你點擊提交的時候會出現一個forbbiddon

的錯誤,就是用setting配置裏的scrf作安全機制的,那麼咱們能夠吧它給註釋了,,,

或者在form表單下面添加一個{% csrf_token %},,,

這纔是真正解決的辦法,註釋不是解決的辦法

<h3>scrf_token</h3><form action="/tag/" method="post">

    {% csrf_token %}

    <p><input type="text" name="haiyan"></p>

    <input type="submit">

</form>

4.自定義標籤和過濾器

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

2)在app中建立templatetags模塊(模塊名只能是templatetags)

3)在templatetags裏面建立任意 .py 文件。如:mytemtags.py

 

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# by hsz

from django import template

from django.utils.safestring import mark_safe

 

register = template.Library()   #register的名字是固定的,不可改變

@register.filter

def my_filter(v1, v2):

    return v1 * v2

 

 

@register.simple_tag

def my_tag1(v1, v2, v3):

    return v1 * v2 * v3

 

 

@register.simple_tag

def my_html(v1, v2):

    temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)

return mark_safe(temp_html)

(4)在使用自定義simple_tagfilterhtml文件中導入以前建立的 my_tags.py

{% load my_tags %}

(5)使用simple_tagfilter(如何調用)

{% load xxx %}  

# num=12

{{ num|filter_multi:2 }} #24

 

{% simple_tag_multi 2 5 %}  

{% simple_tag_multi num 5 %}

注:參數不限,但不能放在if for語句中

注意:filter能夠用在if等語句後,simple_tag不能夠

 

自定義過濾器函數的參數只能兩個,能夠進行邏輯判斷

自定義標籤無參數限制,不能進行邏輯判斷

{% if num|filter_multi:30 > 100 %}

    {{ num|filter_multi:30 }}

{% endif %}

 

二.靜態文件配置

咱們本身導入的一些包就叫作靜態文件

1.在全局中(項目根目錄)先建立一個static(名字隨意)的包,

2.裏面導入咱們的bootstrap,仍是jquery

3.而後在settings.py中加上一些配置

STATIC_URL = '/static/'

#這個配置就至關於下面配置的別名,若是這裏的名字修改了就按照這裏的名字去導入

STATICFILES_DIRS = [

    os.path.join(BASE_DIR,"mystatic"),

]

4.導入css,js,jquery

不要由於你建立的包名是mystatic而把下面路徑中的static修改掉,Django中只有你在setting已經配置了,那麼都是以static爲名,就至關於別名。

<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">

<link rel = "stysheet",href= "/static/css/index.css/">

相關文章
相關標籤/搜索