书写自己的视图

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 ; 页页找不到时会显示该页面