Start
如果py文件中有中文,文件首行必須加上# -*- coding: utf-8 -*-
Django:表格后面還有一個{% csrf_token %}的標(biāo)簽。csrf 全稱是 Cross Site Request Forgery。這是Django提供的防止偽裝提交請求的功能。POST 方法提交的表格,必須有此標(biāo)簽。
登錄檢驗封裝例子
封裝登錄狀態(tài)檢驗
def requires_login(view):
def new_view(request, *args, **kwargs):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
return view(request, *args, **kwargs)
return new_view
在urls.py里調(diào)用
from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3
urlpatterns = patterns('',
(r'^view1/$', requires_login(my_view1)),
(r'^view2/$', requires_login(my_view2)),
(r'^view3/$', requires_login(my_view3)),
)
django模型查詢
在對模型進行查詢時
query_set = Models.objects.filter(Filter)
此時只是構(gòu)建了query語句,然而并沒有進行實際的數(shù)據(jù)庫操作,當(dāng)進行
print query_set
這時候才進行實際的數(shù)據(jù)庫操作。
django文檔原文
QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated. Take a look at this example:
>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
Though this looks like three database hits, in fact it hits the database only once, at the last line (print(q)). In general, the results of a QuerySet aren’t fetched from the database until you “ask” for them. When you do, the QuerySet is evaluatedby accessing the database. For more details on exactly when evaluation takes place, see When QuerySets are evaluated.
視圖渲染
def get_absolute_url(self):
return reverse('blog:detail', kwargs={'pk':self.pk})
由上例子可見,reverse()的第一個參數(shù)可以使的Django順利找到blog應(yīng)用下name為detail的視圖函數(shù),于是reverse會去解析這個視圖對應(yīng)的URL。reverse()函數(shù)的第一個參數(shù)中的空格會被視為合理的符號,例如app_name:index和app_name: index中,會分別匹配到app_name應(yīng)用中的index方法和index方法,空格會被視為方法名中合理的組成部分。
動態(tài)生成URL例子
class Chain(object):
def __init__(self, path='GET '):
self._path = path
def __getattr__(self, path):
return Chain('%s/%s' % (self._path, path))
def __call__(self,path):
return Chain('%s/%s' % (self._path, path))
def __str__(self):
return self._path
__repr__ = __str__