創建 polls/views.pyhtml
# encoding: utf-8 from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the poll index.")
創建 polls/urls.py正則表達式
# -*- coding: UTF-8 -*- from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', url(r'^$', views.index, name='index') )
在根 urls.py 中 include 新的urls.pydjango
urlpatterns = patterns('', url(r'^polls/', include('polls.urls')), url(r'^admin/', include(admin.site.urls)), )
正則表達式 regexapp
視圖參數 view函數
HttpRequest 對象做爲第一個參數編碼
使用正則表達式捕捉的其餘參數url
能夠給視圖 view 傳遞任意參數 kwargsspa
urls 的名稱 namecode
在模版中明確地使用該 urlshtm
在 polls/views.py 中增長几個帶參數的函數定義
def detail(request, poll_id): return HttpResponse("You're looking at poll %s." % poll_id) def results(request, poll_id): return HttpResponse("You're looking at the results of poll %s." % poll_id) def vote(request, poll_id): return HttpResponse("You're voting on poll %s." % poll_id)
增長 urls
演示了參數傳遞的效果
from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), )
每一個視圖會返回一個結果:
能夠直接寫在view裏面,可是硬編碼很差,因此仍是使用模版的方式更符合MVC的習慣。
創建路徑 polls/templates
創建 polls/templates/polls/index.html
{% if latest_poll_list %} <ul> {% for poll in latest_poll_list %} <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
修改 polls/views.py , 使用index.html模版
from django.http import HttpResponse from django.template import RequestContext, loader from polls.models import Poll def index(request): latest_poll_list = Poll.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = RequestContext(request, { 'latest_poll_list': latest_poll_list, }) return HttpResponse(template.render(context))
使用快捷方式 render() 來減小編碼
from django.shortcuts import render from polls.models import Poll def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] context = {'latest_poll_list': latest_poll_list} return render(request, 'polls/index.html', context)
參數
返回
HttpResponse 對象
from django.shortcuts import render from polls.models import Poll def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] context = {'latest_poll_list': latest_poll_list} return render(request, 'polls/index.html', context)
導入 Http404 from django.http import Http404
拋出異常 raise Http404
from django.http import Http404 # ... def detail(request, poll_id): try: poll = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: raise Http404 return render(request, 'polls/detail.html', {'poll': poll})
經過使用 快捷方式 get_object_or_404() 來減小代碼
from django.shortcuts import render, get_object_or_404 # ... def detail(request, poll_id): poll = get_object_or_404(Poll, pk=poll_id) return render(request, 'polls/detail.html', {'poll': poll})
本身寫一個 404 頁面
模版根目錄下創建一個 404.html
經過在根的 urls.py 中設置handler404 變量指定自定義視圖
# 例子 # polls/views.py中增長一個函數 def no_page(request): return HttpResponse("Can't found poll ." ) # 根 urls.py 中增長 from polls import views handler404 = views.no_page
注意:
模版的搜索順序
循環
{% for choice in poll.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %}
<a href="/polls/{{ poll.id }}/"> 改寫爲 <a href="{% url 'detail' poll.id %}">
爲了不不一樣應用之間的命名衝突,可使用namespace參數.
url(r'^polls/', include('polls.urls', namespace="polls")),
<a href="{% url 'polls:detail' poll.id %}">