1. 程式人生 > >Django(二) url 和 模板

Django(二) url 和 模板

expand datetime 一個 absolute index substring 分組 開發 appear

1. URL

URL地址說明:
使用url給視圖函數傳參數
url配置中將正則部分小括號括起來。比如:
    url(r‘^time/plus/(\d{1,2})/$‘, views.hours_ahead)
如果有多個參數則用/隔開,參數需要用分組,比如:
    url(r‘^time/plus/(\d{1,2})/(\d{1,2})/$‘, views.hours_ahead),
給參數命名,使用正則分組的別名,比如:
    url(r‘^time/plus/(?P<time1>\d{1,2})/(?P<time2>\d{1,2})/$‘, views.hours_ahead)
使用分組別名之後,視圖函數的參數必須用分組的別名,但是位置可以不固定。
?
url取別名,那麽在使用此url的地方可以使用別名。比如:
    url(r‘^buy/$‘, views.buy, name=‘buy‘),
    url(r‘^login/$‘, views.login, name=‘login‘),

2. 反向解析

在視圖函數中,反向解析url
    from django.shortcuts import render, redirect
    from django.urls import reverse
    def buy(request):
        return redirect(reverse(‘index‘))
        return redirect(reverse(‘detail‘, args=[2]))
        return redirect(reverse(‘detail‘, kwargs={"id": 2}))

templates中,使用別名:
    {% url ‘detail‘ stu.id %}
?
使用命名空間:
    在工程的urls.py文件中,在include時,可以指定命名空間,更加細化的劃分url。比如: 
        url(r‘^App/‘, include(‘App.urls‘, namespace=‘App‘)),
    指定命令空間後,使用反向解析時需要加上命名空間,比如:
        在視圖函數中: return redirect(reverse(‘students:index‘))
        templates中: {% url ‘students:detail‘ %}

3. 模板

Django框架中,模板是可以幫助開發者快速生成呈現給用戶頁面的工具
模板的設計方式實現了我們MVTVT的解耦,VT有著N:M的關系,一個V可以調用任意T,一個T可以供任意V使用
模板處理分為兩個過程
    加載
    渲染
模板主要有兩個部分
    HTML靜態代碼
    模板語言,動態插入的代碼段(挖坑,填坑)
模板中的動態代碼段除了做基本的靜態填充,還可以實現一些基本的運算,轉換和邏輯
?
模板中的變量: 視圖傳遞給模板的數據,遵守標識符規則
    語法: {{  var }}
    如果變量不存在,則插入空字符串
    
    python manage.py shell: 進入Python環境, 且會自動導入Django配置,建議使用
 
    >>> python manage.py shell   # 進入python環境
    >>> from django import template
    >>> t = template.Template(‘My name is {{ name }}.‘)
    >>> c = template.Context({‘name‘: ‘Nige‘})
    >>> print (t.render(c))
    My name is Nige.
    >>> c = template.Context({‘name‘: ‘Barry‘})
    >>> print (t.render(c))
    My name is Barry.

模板中的點語法
字典查詢
    >>> from django.template import Template, Context
    >>> person = {‘name‘: ‘Sally‘, ‘age‘: ‘43‘}
    >>> t = Template(‘{{ person.name }} is {{ person.age }} years old.‘)
    >>> c = Context({‘person‘: person})
    >>> t.render(c)
    ‘Sally is 43 years old.‘
    
屬性或者方法
    >>> from django.template import Template, Context
    >>> import datetime
    >>> d = datetime.date(2017, 5, 2)
    >>> d.year
    2017
    >>> d.month
    5
    >>> d.day
    2
    >>> t = Template(‘The month is {{ date.month }} and the year is {{ date.year }}.‘)
    >>> c = Context({‘date‘: d})
    >>> t.render(c)
    ‘The month is 5 and the year is 2017.‘

    >>> from django.template import Template, Context
    >>> class Person(object):
    ...     def __init__(self, first_name, last_name):
    ...         self.first_name, self.last_name = first_name, last_name
    >>> t = Template(‘Hello, {{ person.first_name }} {{ person.last_name }}.‘)
    >>> c = Context({‘person‘: Person(‘John‘, ‘Smith‘)})
    >>> t.render(c)
    ‘Hello, John Smith.‘

方法不能有參數。
    >>> from django.template import Template, Context
    >>> t = Template(‘{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}‘)
    >>> t.render(Context({‘var‘: ‘hello‘}))
    ‘hello -- HELLO -- False‘
    >>> t.render(Context({‘var‘: ‘123‘}))
    ‘123 -- 123 -- True‘

列表,使用索引,不允許負索引
    >>> from django.template import Template, Context
    >>> t = Template(‘Item 2 is {{ items.2 }}.‘)
    >>> c = Context({‘items‘: [‘apples‘, ‘bananas‘, ‘carrots‘]})
    >>> t.render(c)
    ‘Item 2 is carrots.‘

模板中的小弊端,調用對象的方法,不能傳遞參數
?
模板中的標簽
語法 {%  tag  %}
作用
    1. 加載外部傳入的變量  
    2. 在輸出中創建文本
    3. 控制循環或邏輯
if 語句:
    格式:
    if單分支
        {% if  表達式 %}
            語句
        {% endif  %}
    if雙分支
        {%  if 表達式 %}
            語句
        {% else  %}
            語句
        {% endif %}
    if多分支
        {% if 表達式 %}
            語句
        {% elif 表達式 %}
            語句
        {% else  %}
            語句
        {% endif %}

    判斷truefalse
        {% if today_is_weekend %}
            <p>Welcome to the weekend!</p> 
        {% endif %}
    使用 and or not,可結合使用,andorand具有更高優先權。
        {% if athlete_list and coach_list %}
            <p>Both athletes and coaches are available.</p>
        {% endif %}

        {% if not athlete_list %}
            <p>There are no athletes.</p>
        {% endif %}

        {% if athlete_list or coach_list %}
            <p>There are some athletes or some coaches.</p>
        {% endif %}

        {% if not athlete_list or coach_list %}
            <p>There are no athletes or there are some coaches.</p>
        {% endif %}
?
        {% if athlete_list and not coach_list %}
            <p>There are some athletes and absolutely no coaches.</p>
        {% endif %}

    使用多個相同的邏輯操作關鍵字也是允許的,比如:
        {% if athlete_list or coach_list or parent_list or teacher_list %}
    使用 innot in
        {% if "bc" in "abcdef" %}
            This appears since "bc" is a substring of "abcdef"
        {% endif %}
        {% if user not in users %}
            If users is a list, this will appear if user isn‘t an element of the list.
        {% endif %}
    使用 is is not
        {% if somevar is True %}
            This appears if and only if somevar is True.
        {% endif %}
?
        {% if somevar is not None %}
            This appears if somevar isn‘t None.
        {% endif %}
for 語句:
    {% for 變量 in 列表 %}
        語句1 
    {% empty %}
        語句2
    {% endfor %}
    當列表為空或不存在時,執行empty之後的語句

    {{ forloop.counter }} 表示當前是第幾次循環,從1數數
    {% for item in todo_list %}
        <p>{{ forloop.counter }}: {{ item }}</p>
    {%endfor %}

    {{ forloop.counter0}}表示當前是第幾次循環,從0數數
    {{ forloop.revcounter}}表示當前是第幾次循環,倒著數數,到1
    {{ forloop.revcounter0}}表示當前第幾次循環,倒著數,到0
    {{ forloop.first }} 是否是第一個  布爾值
    {% for object in objects %}
        {% if forloop.first %}
            <li class="first">
        {% else %}
            <li>
        {% endif %}
        {{ object }}</li>
    {% endfor %}

    {{ forloop.last }} 是否是最後一個 布爾值
    {% for link in links %}
        {{ link }}{% if not forloop.last %} | {% endif %}
    {% endfor %}

    forloop.parentloop
    {% for country in countries %}
      <table>
          {% for city in country.city_list %}
          <tr>
              <td>Country #{{ forloop.parentloop.counter }}</td>
              <td>City #{{ forloop.counter }}</td>
              <td>{{ city }}</td>
          </tr>
          {% endfor %}
      </table>
     {% endfor %}

釋:
    單行註釋
    {#  被註釋掉的內容  #}
?
    多行註釋
    {% comment %}
        內容
    {% endcomment %}

過濾器: 
    {{ var|過濾器 }}
    作用:在變量顯示前修改

    add {{ value|add:2 }}
    沒有減法過濾器,但是加法裏可以加負數
        {{ value|add:-2 }}
    lower 
        {{ name|lower }}
    upper
        {{ my_list|first|upper }}
    截斷:
        {{ bio|truncatechars:30 }}
    過濾器可以傳遞參數,參數需要使用引號引起來
    比如join {{ students|join:‘=‘ }}

    默認值:default,格式 {{var|default:value}}
    如果變量沒有被提供或者為False,空,會使用默認值
?
    根據指定格式轉換日期為字符串,處理時間的
    就是針對date進行的轉換
        {{  dateVal | date:‘y-m-d‘ }}

HTML轉義
    將接收到的數據當成普通字符串處理還是當成HTML代碼來渲染的一個問題
?
    渲染成html:{{ code|safe }}
    關閉自動轉義
    {% autoescape off%}
        code
    {% endautoescape %}
    打開自動轉義轉義
    {% autoescape on%}
        code
    {% endautoescape %}

模板繼承
    block:挖坑
        {% block XXX%}
            code
        {% endblock %}
?
    extends 繼承,寫在開頭位置
        {% extends ‘父模板路徑‘ %}
?
    include: 加載模板進行渲染
         {% include ‘模板文件‘ %}
?
?
?
?
    

Django(二) url 和 模板