參考文檔:
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框架將數據庫里面的字段顯示到前台頁面上:
- models.py里新建相關表_Author
- views.py提供數據查詢及返回相關結果_result
- urls.py指定相關跳轉鏈接
- 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的話,啟動服務器,結果如下:
但是這里有一個問題,我在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"
頁面顯示效果:
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>
美觀一下,加上列標題:
<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>
完工!
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/ 目錄下面