django備忘
1. django註釋
{#。。。。。#}
2. django過濾器
{{ name | lower }},將name變數的值轉化成小寫; {{ my_text|escape|linebreaks }} ,轉移文字為html,再轉化每行到<p>
需要引數的過濾器:{{ bio|truncatewords:"30" }} 這個將顯示變數 bio 的前30 個詞。過濾器引數總是使用雙引號標識。
3. locals()
def method(request):
now = datetime.datetime.now()
return render_to_response('index.html',locals()
return render_to_response('index.html',{'time':now}) 兩種寫法都可以,locals() 將區域性變數都組織成dict 格式,懶人專用
4. {{block.super}}獲取父級頁面對應標籤內容
(1){%block title%}本頁面的title,{{block.super}}{%endblock%}======》》》<title>本頁面的title,父頁面的title</title>
(2)一個頁面中不要出現多個同名的block,否則模板引擎解析將混亂
5. {% extends 'base.html' %}
(1)extends 標記只能放在最頂部,否則失效
(2)extends 後面跟:一個字串或者是一個變數
(3)extends 對傳入的模板名稱,載入方式和get_template(),render_to_response()相同,都是以settings中TEMPLATES_DIRS 為字首
6. MTV (區別於MVC模式)
Django 關注模型(Model)、模板(Template)和檢視(Views),Django 也被稱為 MTV 框架 。
在 MTV 開發模式中:
M 代表模型(Model),即資料存取層。該層處理與資料相關的所有事務:如何存取如何確認有效性、包含哪些行為以及資料之間的關係等。
T 代表模板(Template),即表現層。該層處理與表現相關的決定:如何在頁面或其他型別文件中進行顯示。
V 代表檢視(View),即業務邏輯層。該層包含存取模型及調取恰當模板的相關邏輯。可以把它看作模型與模板之間的橋樑。
7. manage.py 常用命令
python manage.py validate 驗證模型是否有錯誤
python manage.py sqlall books 檢視生成的sql程式碼,sqlall 命令並沒有在資料庫中真正建立資料表,只是把 SQL 語句段打印出來
python manage.py syncdb 執行資料庫同步,生成表結構
python manage.py runserver lcalhost:8080 啟動django應用程式
8.django modles之新增,修改,刪除資料
新增/更新一條資料: (1)例項化一個model類(2)呼叫該例項的save()方法,當二次呼叫save時,不會新增只會修改資料
獲取一張表的所有資料:類名點objects.all()
模組的字串表現(必須返回字串):
class Author(models.Model):
name = CharField(max_length=30)
.................................................................
def __str__(self):
return self.name
刪除一條或多條資料:
l1 = Author.objects.all()
l1.delete() 刪除所有Author表資料,也可以獲取單挑刪除
9. django modles之objects資料管理器(資料篩選)
(1)equal
Author.objects.filter(name='kevin') 對應的sql語句是:select name,.... where name='kevin',為什麼不用select *,而具體指明欄位呢,在python界裡有一信條:“ 明確比不明確來的好 ”
filter(name='kevin',[key=value])可以傳多個類似的引數,相應會生成多個and 條件後查詢
(2)__like, __in,__iexact, __exact,__contains,__gt,__gte,__lt,__lte,__startswith,__istartswith(sqlite中使用),__endswith,__iendswith(sqlite中使用),__range(start,end)
Author.objects.filter(name__contains='kevin') ==>select name,.... where name like '%kevin%'
Author.objects.filter(name__in=['kevin','miao']) ==>select name,.... where name in('kevin','miao')
Author.objects.filter(name__iexact='kevin')==>select name,.... where name like 'kevin')
Author.objects.filter(name__iexact='kevin')==>select name,.... where name = 'kevin')
Author.objects.filter(name__iexact='kevin')==>select name,.... where name like '%kevin%')
Entry.objects.filter(id__gt=4) ==> SELECT ... WHERE id > 4;
Entry.objects.filter(id__gte=4) ==> SELECT ... WHERE id >= 4;
Entry.objects.filter(id__lt=4) ==> SELECT ... WHERE id < 4;
Entry.objects.filter(id__lte=4) ==> SELECT ... WHERE id <= 4;
Entry.objects.filter(headline__startswith='Will') ==> SELECT ... WHERE headline LIKE 'Will%';
Entry.objects.filter(headline__endswith='Will') ==> SELECT ... WHERE headline LIKE '%Will';
start_date=datetime.date(2005,1,1)
end_date=datetime.date(2005,3,31)
Entry.objects.filter(pub_date__range=(start_date,end_date))
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
(3)雙下劃線的特殊使用(上下級關係)user(類)__user_id(屬性)
class Test():
id=models.IntergerField(primarykey=true)
user = models.ForeignKey(User, core=True)
class User():
user_id=models.IntergerField(primarykey=true)
user_name=models.CharField(maxlength=500,null=True)
這樣的話,我們在別處就可以通過Test.user_id來訪問User的主鍵:
result=Test.objects.get(id=1)
result.user_id 是可以的
result.user.user_id也是可以的。
有一點比較奇怪,也是筆者不太明白的是,如果要在對Test物件進行查詢的時候,對user_id進行限制的話,不能用點操作符了,而必須使用
雙下劃線,比如說要取user_id等於1的Test物件,則使用下面的語句:
Test.objects.filter(user__user_id=1)
分析可以發現,在查詢的條件當中,所有的這種上下級的操作符都是雙下劃線,比如說__gt __lt __year __month 再到這裡的user__user_id
(4)objects.get 獲取單個物件
Author.objects.get(name='kevin') 如果結果集中有多個name=‘kevin’ 的資料,或者沒有找到資料,將會丟擲異常
(5)order_by 排序
Author.objects.all().order_by('name') ,‘ -name ’方序(desc)
可以在模型中定義內部類Meta,並指明ordering,預設情況下將使用此排序:
def Author(models.Model):
name = CharField(max_length=30)
................................................................
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
(6)限制返回的資料
Author.objects.all()[0] ===>> select name,.... from Author limit 1
10. model 層修改欄位時如何同步到資料庫
python manage.py syncdb 只能建立table,無法修改,即當model變動時,syncdb不能及時影響到資料庫
解決辦法:
(1)手動修改資料庫
(2)進入資料庫互動命令介面,進行alter操作
(3)使用django-evolution 的命令:
python manage.py evolve --hint --execute
安裝方式: easy_install -U django_evolution
前提是安裝了setuptools,並把Scripts目錄新增到環境變數
11. django 之自定義模板
settings 中 TEMPLATE_DIRS 配置設定了Django 載入模板的目錄列表。 要自定義Django 的管理模板,只需要拷貝 Django 發行版中的整個管理模板到你在 TEMPLATE_DIRS裡設定的模板目錄裡。 管理站點的頭部區域在模板 admin/base_site.html 裡。預設情況下,這個模板在 Django管理模板目錄 django/contrib/admin/templates 裡,你可以在Django 的安裝 目錄找到它,例如Python 的 site-packages 目錄或者你安裝的其他目錄。要自定義 這個 base_site 模板,把這個模板拷貝到你的模板目錄下的 admin 子目錄。 例如,假定你的模板目錄是 "/home/mytemplates" ,拷貝 django/contrib/admin/templates/admin/base_site.html 到 /home/mytemplates/admin/base_site.html 。不要忘了有 admin 子目錄。 然後,編輯這個新 admin/base_site.html 檔案,替換你自己站點的名稱上去。 備註 每個Django 預設的管理模板都可以過載。要過載一個模板,就象 base_site.html 一樣的去做:把它從預設目錄中拷貝到你自己的模板目錄中然後修改它。
12. django 之urls配置技巧
##########################from mybook.views import method1, method2, method3
urlpatterns = patterns('發現這裡一般都是空的',
(r'^m1/$', method1),
(r'^m2/$', method2),
(r'^m3/$', method3),
)
##########################
這種配置如果views過多會導致難於閱讀和管理
##########################
#from mybook.views import method1, method2, method3
urlpatterns = patterns('mybook.views',
(r'^m1/$', ‘method1’),
(r'^m2/$', ‘method2‘),
(r'^m3/$', ’method3’),
)
##########################
提取出一個公共檢視字首 mybook.views,不要在字首後面跟著一個點號("." ),也不要在檢視字串前面放一個點號("." ), Django 會自動處理它們.
推薦使用這種方式,而且可以使用多個檢視字首 :
#from mybook.views import method1, method2, method3
urlpatterns = patterns('mybook.views',
(r'^m1/$', ‘method1’),
(r'^m2/$', ‘method2‘),
(r'^m3/$', ’method3’),
)
urlpatterns += patterns('youbook.views',
(r'^m1/$', ‘method1’),
(r'^m2/$', ‘method2‘),
(r'^m3/$', ’method3’),
)
django 框架尋找模組級別變數:urlpatterns,改變可以動態構建此處使用 “ += ”進行合併
利用動態構建urlpatterns技術,可以製作除錯模式特例,如:
在urls中新增:
if settings.DEBUG:
urlpatterns += patterns('',
(r'^debuginfo$', 'mysite.views.debug'),
)
只有在settings中設定DEBUG=True的時候,訪問地址“debuginfo”才有效
##########################
URL 命名組方式
views.py 中:
def method1(year, month):
pass
urls.py 中:
urlpatterns = patterns('mybook.views',
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)
在 Python 正則表示式中,命名的正則表示式組的語法是 (?P<name>pattern) ,這裡 name 是組的名字(引數名),而 pattern 是匹配的某個模式。 使用命名組可以讓你的URLconfs 更加清晰,減少引數次序可能搞混的潛在 BUG。
如果我們想修改 URL 把月份放到 年份的 前面 ,而不使用命名組的話,我們就不得不去修改檢視 month_archive 的引數次序。如果我們使用命名組的話,修改 URL 裡提取引數的次序對檢視沒有影響
傳遞額外的引數到檢視函式中
urlpatterns = patterns('',(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)