天天看點

Django學習(三)模闆定制

  在 Django學習(一)一首情詩

中,views.py中HTML被直接寫死在代碼之中,雖然這樣便于解釋視圖是如何工作的,但直接将HTML寫死到視圖卻不算一個好主意。因為:

- 對頁面設計進行的任何改變都必須對Python代碼進行相應的修改,而站點設計的修改往往比底層Python代碼的修改要頻繁得多。

- Python代碼編寫和HTML設計是兩項不同的工作,大多數專業的網站開發環境都将它們配置設定給不同的人員來完成。

- 程式員編寫Python代碼和設計人員制作模闆兩項工作同時進行的效率是最高的,遠勝于讓一個人等待另一個人完成對某個既包含Python又包含HTML的檔案的編輯工作。

  基于以上原因,Django推薦使用模闆。模闆(Template)是一個文本,用于分離文檔的表現形式和内容。模闆通常用于産生HTML.

  本次分享的目标是利用Django的模闆來産生一封簡單的情書。這需要用到Django模闆方面的知識。

  先建立項目love_letter:

django-admin.py startproject love_letter           

切換到該檔案夾下的love_letter目錄,建立letter.html檔案,即Django的模闆,代碼如下:

<html>
    <head>
         <title>Love Letter</title>
    </head>
<body>
    <h1>Love Letter for {{ name }}</h1>

    <p>Dear {{ name }}:</p>

    <p>Now you are reading a letter from your BF. Thanks for reading it.</p>

    <p>We met on {{met_date}}, and today is {{today}}, so we have been together for {{days}} days.</p>

    <p>Now you live in {{your_city}}, and I live in {{my_city}}.
        {% ifequal your_city.lower my_city.lower %}
            So lucky for living in the same city!
    {% else %}
            What a pity for not being together!
        {% endifequal %}
    </p>

    <p>So glad to meet you! You must be the heaven-sent angel for you are
        <ul>
            {% for trait in traits %}
                <li>{{trait}}</li>
            {% endfor %}
        </ul>
    I'm so fascinated of you!
    </p>

    <p>
        It is now {{weather}} in {{your_city}},
        {% ifequal weather 'cold'%}
            take care of yourself.
        {% else %}
            {% ifequal weather 'hot'%}
                take care of yourself.
            {% else %}
                nice weather, isn't it?
            {% endifequal %}
        {% endifequal %}

        Hoping for seeing you soon! May you have a pleasent day!
    </p>

    <p>Yours Sincerely,<br/>{{ today }}<br/>{{ author }}</p>

</body>
</html>           

  我們有必要對這個模闆做解釋:

- {{ name }}表示name變量,所有{{…}}裡面包含的是變量。

- {% ifequal your_city.lower my_city.lower %}為标簽(tag),表示if判斷語句,判斷兩個變量是否相等,需要用{% endifequal %}來結束。

- {% for trait in traits %}為标簽,表示for循環語句,traits可以為list或者set序列,需要用{% endfor %}。

- 其餘代碼同HTML相同

  定義好模闆之後,我們應該告訴Django怎樣使用這個模闆,是以,需要在settings.py中的TEMPLATES設定DIRS:

Django學習(三)模闆定制

  這樣我們就能在視圖中使用該模闆了。在相同的檔案夾下,建立views.py,代碼如下:

from django.shortcuts import render_to_response
import datetime

def output(request):
    c = {'name':'Rose',
         'met_date': datetime.datetime(2016,5,24,18,0,0),
         'today': datetime.datetime.now(),
         'your_city': 'shanghai',
         'my_city': 'Shanghai',
         'traits': ['young and pretty', 'lovely and positive', 'warm-hearted and careful', 'independent and clever'],
         'weather': 'cold',
         'author': 'Jclian'
          }
    c['days'] = (c['today'] - c['met_date']).days
    return render_to_response('letter.html', c)           

其中c為字典,keys為模闆中定義的變量,values可以自由定義。

  最後配置好urls.py,并開啟8000端口,在網頁中輸入localhost:8000,得到的頁面如下:

Django學習(三)模闆定制

參考文獻:

1. Django中文教程.pdf:

http://download.csdn.net/download/huangzhichang13/8177581

2. Django官方文檔之Templates:

https://docs.djangoproject.com/en/2.0/topics/templates/