在Django中一个视图有指定函数和指定模版组成。
对于某些特定的应用应该分成若干视图。例如博客系统
而对于投票应用,则由
在Django中,页面由视图(views)表达,而视图由一个简单的函数(成员函数)展示。Django通过URL来精确匹配一个视图,即URLconfs
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You‘re at the poll index.")
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns(‘‘,
url(r‘^$‘, views.index, name=‘index‘)
)
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)),
)
(?P<poll_id>\d+)
指该部分的URL为一个参数,参数的名字由?P<poll_id>指定,\d+只由一个或更多的数组组成。
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‘),
)
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)
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/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 %}
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))
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)
from django.http import Http404
from django.shortcuts import render
from polls.models import Poll
# ...
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})
此时的polls/detail.html可只填写内容{{poll}}
from django.shortcuts import render, get_object_or_404
from polls.models import Poll
# ...
def detail(request, poll_id):
poll = get_object_or_404(Poll, pk=poll_id)
return render(request, ‘polls/detail.html‘, {‘poll‘: poll})
针对get的函数为get_object_or_404,针对filter的函数为get_list_or_404。
此快捷方式有助于在视图层不用关心数据层的内容,更好的解耦合。
#polls/detail.html
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
poll.choice_set.all为函数调用,返回一个列表。
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
<li><a href="{% url ‘detail‘ poll.id %}">{{ poll.question }}</a></li>
#既是前面提到的URL别名
上文所述的别名会造成重名而使Django匹配出错,因此使用命名空间
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns(‘‘,
url(r‘^polls/‘, include(‘polls.urls‘, namespace="polls")),
url(r‘^admin/‘, include(admin.site.urls)),
)
相应地,修改
<li><a href="{% url ‘polls:detail‘ poll.id %}">{{ poll.question }}</a></li>
Django初级手册3-视图层与URL配置,布布扣,bubuko.com
原文:http://www.cnblogs.com/solontan/p/3570823.html