URL工做原理

其實在django中實現一個功能只須要三個步驟便可,這裏我姑且叫它三部曲。

這三部曲就是:html

  1. 定義urls映射
  2. 定義views
  3. 定義templates

什麼是URL?

URL就算一個WEB地址,你在瀏覽器輸入這個地址,而後瀏覽器返回相應的網頁給你。 好比http://djangogirls.com是一個URL,而127.0.0.1:8000一樣也是個URL,默認就是http協議的。前端

Django中的URL工做原理

咱們打開mysite/urls.py文件,會發現相似下面這樣:python

1
2
3
4
5
6
7
8
9
10
11
12
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),

url(r'^admin/', include(admin.site.urls)),
)

上面的兩行註釋先不要管,這個之後再用到。 django默認已經爲咱們添加了admin的URL配置。 當django碰到以admin/開頭的URL的時候會去admin.site.urls裏面去尋找對應的匹配。 全部和admin相關的urls配置都寫在一個文件中,這樣就便於管理了。linux

正則表達式

你能夠看到上面的url用到了正則表達式,好比’^admin/’、’^$’等等, django是經過正則式來匹配URL的。關於正則式這裏不想展開太多。能夠參考相關數據和教程。git

第一個django url配置

如今咱們要將http://127.0.0.1:8000/這個首頁地址映射到一個顯示最新文章列表的頁面上面去。通常的博客首頁基本都是這樣的。web

爲了保持mysite/urls.py配置文件的簡介,咱們最好將博客的url配置放到單獨的文件中。在mysite/urls.py中去將它引進來便可。面試

那麼你的mysite/urls.py文件如今相似於這樣了:正則表達式

1
2
3
4
5
6
7
8
9
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'', include('blog.urls')),
)

 

blog.urls

建立文件blog/urls.py,而後加入下列內容redis

1
2
3
4
5
6
from django.conf.urls import patterns, include, url
from . import views

urlpatterns = patterns('',
url(r'^$', views.post_list),
)

 

如今咱們將r’^$’的url映射到視圖views.post_list。算法

不過你要是如今就訪問首頁http://127.0.0.1:8000/的話會報錯的。

 

爲啥,由於你的視圖views.post_list如今沒有實現啊,找不到這個方法!

那麼接下來咱們就來說解view的實現了。

什麼是view?

view也叫視圖,在django中它存放了實際的業務邏輯。這個跟咱們一般所說的MVC中的view是不同的。

django的MTV模式

這裏我稍微解釋下django的結構,通常咱們稱之爲MTV模式:

  1. M 表明模型(Model),即數據存取層。該層處理與數據相關的全部事務:如何存取、如何確認有效性、包含哪些行爲以及數據之間的關係等。
  2. T 表明模板(Template),即表現層。該層處理與表現相關的決定:如何在頁面或其餘類型文檔中進行顯示。
  3. V 表明視圖(View),即業務邏輯層。該層包含存取模型及調取恰當模板的相關邏輯。你能夠把它看做模型與模板之間的橋樑。

那麼一般意義的控制器Controller去哪裏了呢,細心的童鞋應該會猜到了,那就是咱們上一節所講的urls.py配置文件。

一句話總結:URLconf+MTV構成了django的整體架構。

blog/views.py

這個文件初始內容是這樣的:

1
2
3
from django.shortcuts import render

# Create your views here.

 

添加一個最簡單的視圖:

1
2
3
def post_list(request):

return render(request, 'blog/post_list.html', {})

 

咱們定義了一個方法post_list,它的參數是request,使用render函數返回一個html模板blog/post_list.html。

接下來咱們訪問下首頁,OMG,又出錯了:

 

此次報的錯是模板blog/post_list.html找不到。這個是顯而易見的,由於咱們根本尚未定義這個html模板。

彆着急,繼續沿着教程往下看就行…

什麼是模板?

一個模板就是一個使用固定格式呈現動態內容的可重用的文件。 好比你可使用一個模板來寫郵件,每封郵件可能有不一樣的內容,寄給不一樣的人,可是它們的格式是同樣的。

Django中的模板使用HTML文件,至於神馬是HTML,這個去參考下W3C或者自行google下, 不過若是作web開發的人不懂HTML,請不要告訴別人我認識你。^_^

第一個模板

建立一個模板就是建立一個HTML文件。模板文件存儲在blog/templates/blog目錄下面, 首先在blog目錄下建立templates目錄,而後再在templates目錄下建立blog目錄,至於爲啥要這麼作, 先不用管,django裏面不少目錄都是約定好的,這個就跟maven是同樣的,約定高於配置。 因此你先照着作就是了。目錄結構以下:

blog
└───templates
└───blog

 

而後在blog/templates/blog目錄下建立一個post_list.html文件,如今裏面尚未內容。

這時候再次訪問首頁,效果以下:

 

一片空白,但沒有報錯了。

在post_list.html中添加點東西:

1
2
3
4
<html>
<p>Hi there!</p>
<p>It works!</p>
</html>

 

再次訪問http://192.168.203.95:8000/:

 

動態模板

不過目前爲止咱們還只能顯示靜態的網頁。怎樣將文章列表在首頁顯示出來呢?

咱們已經有了模型Post,有了模板post_list.html,怎樣使得模型數據在模板中顯示出來呢, 這個就是視圖的功能了,實際上,django中的視圖的做用就是鏈接模型和模板的橋樑。 在視圖中,經過QuerySet將數據庫中的數據檢索出來,而後傳遞給模板,模板負責顯示出來。

首先打開blog/views.py,它目前的內容是這樣的:

1
2
3
4
from django.shortcuts import render

def post_list(request):
return render(request, 'blog/post_list.html', {})

 

這時候咱們將Post模型導入進來

1
2
from django.shortcuts import render
from .models import Post

 

注意咱們仍是用到了相對導入,這是python3的強大功能。

QuerySet

是時候請出QuerySet了,在模型和ORM小節咱們已經介紹過。

如今咱們想要將數據庫中的文章都檢索出來而且按照發布日期逆序排序,使得最新的文章放前面。

1
2
3
4
5
6
from django.shortcuts import render
from .models import Post

def post_list(request):
posts = Post.objects.filter(published_date__isnull=False).order_by('-published_date')
return render(request, 'blog/post_list.html', {'posts': posts})

 

注意render函數中最後一個參數{‘posts’: posts},這個就是用來給模板傳遞數據的。

模板標籤

HTML頁面只識別HTML標籤,那麼怎樣讓生成動態的內容呢?答案就是使用django自帶的模板標籤, 包括了判斷、循環、管道等語法。咱們已經獲取了文章的列表了,那麼可使用for循環來生成相應的HTML頁面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Django Girls Blog</title>
</head>
<body>
<div>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
{% for post in posts %}
<div>
<p>published: {{ post.published_date }}</p>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaks }}</p>
</div>
{% endfor %}
</body>
</html>

 

{% for %} 和{% endfor %}之間會循環每一個post,而後每次生成一段

如今再次訪問首頁,效果以下:

 

別忘了一件事

別忘了把它push到pythonanywhere上面去。

git add .
git commit -m '動態文章列表首頁'
git push origin master

恭喜你,目前爲止基本的全程已經貫通了。打開admin後添加幾篇文章, 記得填上發佈日期,再刷新下首頁,看會不會顯示出來。

好了,這時候你能夠出門左拐去小賣部給本身買點棒棒糖獎勵下本身了!

 
分類:  Django
 
好文要頂  關注我  收藏該文   
0
0
 
 
 
« 上一篇: Django開發博客- 部署
» 下一篇: Django開發博客- 頁面美化
posted @  2016-07-08 23:42 七月的尾巴_葵花 閱讀(101) 評論(0) 編輯 收藏
 
相關文章
相關標籤/搜索