Django—模板渲染


參考文檔:

http://www.cnblogs.com/fnng/p/4373108.html

https://code.ziqiangxuetang.com/django/django-intro.html

Django的學習已經丟了很長一段時間了,時值年底,基本工作都差不多了,准備重新撿起來。

學習心得也會有空mark一下!

准備作業:讓我們一覽 Django 全貌

urls.py
網址入口,關聯到對應的views.py中的一個函數(或者generic類),訪問網址就對應一個函數。

views.py
處理用戶發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示內容,比如登陸后的用戶名,用戶請求的數據,輸出到網頁。

models.py
與數據庫操作相關,存入或讀取數據時用到這個,當然用不到數據庫的時候 你可以不使用。

forms.py
表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工作以及輸入框的生成等工作,當然你也可以不使用。

templates 文件夾

views.py 中的函數渲染templates中的Html模板,得到動態內容的網頁,當然可以用緩存來提高速度。

admin.py
后台,可以用很少量的代碼就擁有一個強大的后台。

settings.py
Django 的設置,配置文件,比如 DEBUG 的開關,靜態文件的位置等。

言歸正傳,本次主要解決的問題是,通過Django框架將數據庫里面的字段顯示到前台頁面上:

  1. models.py里新建相關表_Author
  2. views.py提供數據查詢及返回相關結果_result
  3. urls.py指定相關跳轉鏈接
  4. templates/app/query.html 負責處理views.py的返回值及渲染顯示結果
#models.py
from django.db import models # Create your models here.

class Author(models.Model): name=models.CharField(u'姓名',max_length=50) qq=models.CharField(max_length=10) addr=models.TextField() email=models.EmailField() def __str__(self): return self.name
#views.py
from app.models import Author def query(request): #result=Author.objects.all()
    result=Author.objects.values_list() #返回數據庫查詢結果(sql:select * from Author ),list類型,

    assert isinstance(request, HttpRequest) return render( request, 'app/query.html', { 'title':'Query', #將查詢結果渲染到app/query.html的變量result中
            'result':result, 'year':datetime.now().year, } )
#urls.py

import app.views urlpatterns = [ # Examples:
 url(r'^admin/', admin.site.urls,name='admin'), url(r'^query/', app.views.query,name='query'),

#templates\app\query.html

<table   class="table table-hover"> #引用bootstrap表格樣式
  <caption>   Result of Query  </caption> #遍歷循環賦值 {% for i in result %} <tr>
 {% for j in i %} <td>{{ j }}</td>
 {% endfor %} </tr>
 {% endfor %} </table>

{% endblock %}

 

一切ok的話,啟動服務器,結果如下:

2018-01-16_185401

但是這里有一個問題,我在views.py里面使用的result=Author.objects.values_list() ,是把該表的所有數據都取出來了。如果現在只想取某幾個字段的數據(不想要ID字段),目前我的能力有兩種方法解決:

1、views.py里面直接查詢我想要的字段:

result=Author.objects.values_list('name','qq','addr','email')

結果對比,可以在django shell里面看到:

>>> print (str(Author.objects.values_list().query)) SELECT "app_author"."id", "app_author"."name", "app_author"."qq", "app_author"." addr", "app_author"."email" FROM "app_author" >>> print (str(Author.objects.values_list('name','qq','addr','email').query)) SELECT "app_author"."name", "app_author"."qq", "app_author"."addr", "app_author"
."email" FROM "app_author"

頁面顯示效果:

2018-01-16_190656

2、views.py里查詢條件不變,更改urls里的循環條件,即不輸出查詢結果列表里面第一個數據(ID字段):

(模板里列表索引取值為 i.n,而不是python里面的i[1])

<table   class="table table-hover">
  <caption>   Result of Query  </caption> {% for i in result %} <tr>
        <td>{{ i.1 }}</td>
        <td>{{ i.2 }}</td>
        <td>{{ i.3 }}</td>
        <td>{{ i.4 }}</td>
    </tr>
 {% endfor %} </table>

頁面顯示效果:2018-01-16_191227

美觀一下,加上列標題:

<table   class="table table-hover">
  <caption>   Result of Query  </caption> 
    <tr>
 {#<td> ID </td>#}
    <td> NAME </td>
    <td> QQ </td>
    <td> ADD </td>
    <td> MAIL </td>
    </tr>
 {% for i in result %} <tr>
        <td>{{ i.1 }}</td>
        <td>{{ i.2 }}</td>
        <td>{{ i.3 }}</td>
        <td>{{ i.4 }}</td>
    </tr>
 {% endfor %} </table>

2018-01-16_191637

完工!

 

Tips:

Django 模板查找機制: Django 查找模板的過程是在每個 app 的 templates 文件夾中找(而不只是當前 app 中的代碼只在當前的 app 的 templates 文件夾中找)。各個 app 的 templates 形成一個文件夾列表,Django 遍歷這個列表,一個個文件夾進行查找,當在某一個文件夾找到的時候就停止,所有的都遍歷完了還找不到指定的模板的時候就是 Template Not Found (過程類似於Python找包)。這樣設計有利當然也有弊,有利是的地方是一個app可以用另一個app的模板文件,弊是有可能會找錯了。所以我們使用的時候在 templates 中建立一個 app 同名的文件夾,這樣就好了。

這就需要把每個app中的 templates 文件夾中再建一個 app 的名稱,僅和該app相關的模板放在 app/templates/app/ 目錄下面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM