Python web開發(fā)筆記五:Django開發(fā)進(jìn)階一

理解上下文

render(request,x.html,context)
request:請(qǐng)求的固定寫法。
x.html:模板,需要填補(bǔ)丁的模板。
context:上下文,填充模板的補(bǔ)丁。

模板的使用流程

  • 寫模板,創(chuàng)建Template對(duì)象,用模板語(yǔ)言進(jìn)行修改。
  • 創(chuàng)建Context,context是一組字典,用來傳遞數(shù)據(jù)給Template對(duì)象。
  • 調(diào)用Template對(duì)象的render()方法傳遞context來填充模板。

創(chuàng)建并使用模板

  • 單獨(dú)創(chuàng)建templates、staitc文件夾,將之前寫的前端文件如何放入Django項(xiàng)目。
  • 網(wǎng)頁(yè)放入tempaltes,所有的靜態(tài)文件放入static中。(靜態(tài)文件是指網(wǎng)站中的 js, css, 圖片,視頻等)
  • 修改setting,TEMPLATES,DIRS:[os.path.join(BASE_DIR,'templates').replace('\','/')], (注意逗號(hào)不能夠少)
  • html最上方加入{% load staticfiles %},在模板中引入靜態(tài)文件,修改模板中的固定地址改為動(dòng)態(tài)地址。({% static 'css/semantic.css' %})

模板語(yǔ)言

模板語(yǔ)言分為:模板變量,模板標(biāo)簽,模板過濾器。

模板變量:

{{ value }},{{ Person.name }}

模板標(biāo)簽:

{% for item in list %}
    {{ item }}
{% endfor %}

{% for key, value in dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}

注:標(biāo)簽可以多重進(jìn)行嵌套。

其他:

{% forloop.first %}是一個(gè)布爾值。在第一次執(zhí)行循環(huán)時(shí)該變量為True
{% forloop.last %}是一個(gè)布爾值;在最后一次執(zhí)行循環(huán)時(shí)被置為True。

模板過濾器:

{{ value|default:"nothing" }} 如果為空則顯示nothing的樣式。
{{ value|truncatewords:200 }} 只顯示前200個(gè)字符。
{{ name|lower }} 功能是轉(zhuǎn)換文本為小寫。

案例

使用 django 的'日期字段'給每篇文章添加類似圖中的一個(gè)發(fā)布日期,格式是「2016-11-05」

model增加:
class Aritcle(models.Model):
    date = models.DateField(auto_now=True)

html增加:
<span class="grey">{{ article.date|date:"Y-m-d" }}</span>

模板繼承

extends標(biāo)簽

定義一個(gè)父模板為base.html,寫出HTML的骨架,將需要子塊修改的地方用{% block %}{% endblock %}標(biāo)出。
子模板使用{% extends "base.html" %}將內(nèi)容填寫進(jìn)這些空白的內(nèi)容塊。
模板繼承允許你建立一個(gè)基本的”骨架”模板, 它包含你所有最常用的站點(diǎn)元素并定義了一些可以被子模板覆蓋的block。
如果你需要在子模板中引用父模板中的 block 的內(nèi)容,使用 “{{ block.super }}“ 變量.這在你希望在父模板的內(nèi)容之后添加一些內(nèi)容時(shí)會(huì)很有用.(你不必完全覆蓋父模板的內(nèi)容.)

include標(biāo)簽

{% include %}該標(biāo)簽允許在(模板中)包含其它的模板的內(nèi)容。
標(biāo)簽的參數(shù)是所要包含的模板名稱,可以是一個(gè)變量,也可以是用單/雙引號(hào)硬編碼的字符串。
每當(dāng)在多個(gè)模板中出現(xiàn)相同的代碼時(shí),就應(yīng)該考慮是否要使用 {% include %} 來減少重復(fù)。

  • stackoverflow問題:{% include %} vs {% extends %} in django templates?

Extending allows you to replace blocks (e.g. "content") from a parent template instead of including parts to build the page (e.g. "header" and "footer"). This allows you to have a single template containing your complete layout and you only "insert" the content of the other template by replacing a block.

If the user profile is used on all pages, you'd probably want to put it in your base template which is extended by others or include it into the base template. If you wanted the user profile only on very few pages, you could also include it in those templates. If the user profile is the same except on a few pages, put it in your base template inside a block which can then be replaced in those templates which want a different profile.

模板注釋

注釋使用{# #}注釋不能跨多行 eg: {# This is a comment #}

urls相關(guān)

urls中定義鏈接(三種)

Function views
Add an import:  from my_app import views
Add a URL to urlpatterns:  url(r'^$', views.home, name='home')

Class-based views
Add an import:  from other_app.views import Home
Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')

Including another URLconf
Import the include() function: from django.conf.urls import url, include
Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))

url的name屬性

url(r'^add/$', calc_views.add, name='add'),
這里的name可以用于在 templates, models, views ……中得到對(duì)應(yīng)的網(wǎng)址,相當(dāng)于“給網(wǎng)址取了個(gè)名字”,只要這個(gè)名字不變,網(wǎng)址變了也能通過名字獲取到。

url正則表達(dá)式

url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','get_news_list',name="news_archive" )

<year> <month> 在view的參數(shù)獲得 如:def index(request,year,month)

url的include用法

(r'^weblog/', include('mysite.blog.urls')), 
(r'^photos/', include('mysite.photos.urls')),

指向include()的正則表達(dá)式并不包含一個(gè)$(字符串結(jié)尾匹配符)。每當(dāng)Django 遇到include()時(shí),它將截?cái)嗥ヅ涞腢RL,并把【剩余】的字符串發(fā)往被包含的 URLconf 作進(jìn)一步處理。

創(chuàng)建使用后臺(tái)

使用django自帶的后臺(tái),可以可視化管理后臺(tái)的數(shù)據(jù)。

創(chuàng)建超級(jí)管理員

python manage.py createsuperuser # 設(shè)置用戶名,密碼。

注冊(cè)自定義model

from models import People
admin.site.register(People)

修改顯示字段

管理后臺(tái)默認(rèn)顯示People Obejct,在model中添加返回值方法,修改顯示效果。

  def __str__(self):
      return self.name 

修改后臺(tái)密碼的方法

  python manage.py createsuperuser --username admin
  python manage.py changepassword admin

admin顯示自定義字段

  from django.contrib import admin
  from .models import Article

  class ArticleAdmin(admin.ModelAdmin):
      list_display = ('title','pub_date','update_time',)
    
  admin.site.register(Article,ArticleAdmin)

引入數(shù)據(jù)

Django ORM對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,數(shù)據(jù)庫(kù)操作完成之后,記得要進(jìn)行save()保存。

數(shù)據(jù)庫(kù)操作

Article.objects.all() 獲取表中所有對(duì)象
Aritcle.objects.get(pk=1) # Django中pk=primary key,和id等價(jià)。
Article.objects.filter(pub_date__year=2006) # 使用過濾器獲取特定對(duì)象
Article.objects.all().filter(pub_date__year=2006) #與上方一致

## 鏈?zhǔn)竭^濾
>>> Aritcle.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.date.today()
... ).filter(
...     pub_date__gte=datetime(2005, 1, 30)
... )

Article.objects.create(author=me, title='Sample title', text='Test') #創(chuàng)建對(duì)象
Person.objects.get_or_create(name="WZT", age=23) # 防止重復(fù)很好的方法

Article.objects.all()[:5] 記錄前5條 
Person.objects.all().reverse()[:2] # 最后兩條
Person.objects.all().reverse()[0] # 最后一條

>>> Post.objects.filter(title__contains='title') # 包含查詢
[<Post: Sample title>, <Post: 4th title of post>] 
# 注在title與contains之間有兩個(gè)下劃線字符 (_)。
# Django的ORM使用此語(yǔ)法來分隔字段名稱 ("title") 和操作或篩選器("contains")。

Post.objects.order_by('-created_date') # 對(duì)象進(jìn)行排序,默認(rèn)升序,添負(fù)號(hào)為降序。
Person.objects.filter(name__iexact="abc") # 不區(qū)分大小寫
Person.objects.filter(name__exact="abc") # 嚴(yán)格等于

Person.objects.filter(name__regex="^abc")  # 正則表達(dá)式
Person.objects.filter(name__iregex="^abc") # 不區(qū)分大小寫

Person.objects.exclude(name__contains="WZ")  # 排除
Person.objects.filter(name__contains="abc").exclude(age=23
 #找出名稱含有abc, 但是排除年齡是23歲的

QuerySet創(chuàng)建對(duì)象的四種方法

Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com

twz = Author(name="WeizhongTu", email="tuweizhong@163.com")
twz.save()

twz = Author()
twz.name="WeizhongTu"
twz.email="tuweizhong@163.com"

Author.objects.get_or_create(name="WeizhongTu", email="tuweizhon“)
# 返回值(object, True/False)

QuerySet是可迭代的

es = Entry.objects.all()
for e in es:
    print(e.headline)

檢查對(duì)象是否存在

Entry.objects.all().exists() 返回布爾值

拓展閱讀:
課堂操作內(nèi)容文檔

備注
該筆記源自網(wǎng)易微專業(yè)《Python web開發(fā)》1.2節(jié)
本文由EverFighting創(chuàng)作,采用 知識(shí)共享署名 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,653評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,738評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,179評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評(píng)論 1 283
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,610評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,916評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容