1. 程式人生 > >django備忘

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'}),
)