书写自己的视图
vi polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You’re at the poll index.")
新建urls.py
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns(’’,
url(r’^$’, views.index, name=’index’)
)
vi mysite/urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns(’’,
url(r’^polls/’, include(’polls.urls’)),
url(r’^admin/’, include(admin.site.urls)),
)
vi 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)
将视图加入url
vi polls/urls.py
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’),
)
写些真正做事的视图:
from django.http import HttpResponse
from polls.models import Poll
def index(request):
latest_poll_list = Poll.objects.order_by(’-pub_date’)[:5]
output = ’, ’.join([p.question for p in latest_poll_list])
return HttpResponse(output)
在polls/tmplates/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 %}
让视图使用模板:
from django.http import HttpResponse
from django.template import Context, 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 = Context({
’latest_poll_list’: latest_poll_list,
})
return HttpResponse(template.render(context))
使用shortcut精简模板加载:
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错误:
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})
detail视图的模板:detail.html
<h1>` poll`.`question `</h1>
<ul>
{% for choice in poll.choice_set.all %}
<li>` choice`.`choice_text `</li>
2.5. Writing your first Django app, part 3 41
Django Documentation, Release 1.5
{% endfor %}
</ul>
去掉超连接中的硬编码:
<li><a href="{% url ’detail’ poll.id %}">` poll`.`question `</a></li>
其中,detail是url中的name:
url(r’^(?P<poll_id>\d+)/$’, views.detail, name=’detail’),
给url names 名称空间:
usls.py中,url(r’^polls/’, include(’polls.urls’, namespace="polls")),
模板中改为:<li><a href="{% url ’polls:detail’ poll.id %}">` poll`.`question `</a></li>
部署到生产环境将DEBUG = False
另外:ALLOWED_HOSTS = '*'
不然的话,页面没找到会显示500错误而不是404
新建模板mysite/mysite/templates/404.html ; 页页找不到时会显示该页面