三、Writing your first Django app, part 3
写第一个视图
-
建立 polls/views.py
# 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.py
urlpatterns = patterns('', url(r'^polls/', include('polls.urls')), url(r'^admin/', include(admin.site.urls)), )
url() 函数的四个参数
-
正则表达式 regex
- 从上往下顺序查找
- 不匹配 GET POST 参数
- 不匹配域名
-
视图参数 view
-
HttpRequest 对象作为第一个参数
-
使用正则表达式捕捉的其他参数
- 普通捕捉:位置参数
- 命名捕捉:命名参数
-
-
可以给视图 view 传递任意参数 kwargs
-
urls 的名称 name
在模版中明确地使用该 urls
再写一个视图
-
在 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'), )
写一个实际功能的视图
每个视图会返回一个结果:
- HttpResponse 对象
- Http404
可以直接写在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)
快捷方式 render()
-
参数
- request
- 模版文件
- 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)
-
引发一个404异常
-
导入 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
注意:
- DEBUG 必须是False ,否则无效果
- 本地开发要设置允许本地访问 ALLOWED_HOSTS = ['localhost',]
-
使用模版系统
模版的搜索顺序
- 对象
- 属性
- 列表循环
循环
{% 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参数.
- 在根 urls.py 中,
url(r'^polls/', include('polls.urls', namespace="polls")),
- 模版中
<a href="{% url 'polls:detail' poll.id %}">
来源:oschina
链接:https://my.oschina.net/u/1587711/blog/225289