创建 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 %}">