django框架从零开始_009_通用页面

来源:互联网 发布:如何备份mysql 编辑:程序博客网 时间:2024/06/05 14:33

参考:https://docs.djangoproject.com/en/1.9/intro/tutorial04/#use-generic-views-less-code-is-better


我们做的detail、result、index的界面非常简单,但是同时,也很冗余。这些页面做了标准网页开发应该做的事情:根据url从数据库中读取数据、加载模版页并显示出来。这种应用太常见了,所以django提供了一个快捷的"Generic Views"系统。它抽取出来的最简练的模式,你可以不用写什么view而就可以创建你的app。

下面让我们来把我们的polls系统利用generic views改写一下。我们需要做如下几步:

  1. 改写URLConf
  2. 删除不用的views
  3. 引入新的页面
首先修改polls/urls.py:
urlpatterns = [    url(r'^$', views.IndexView.as_view(), name='index'),    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),]

和原来相比,我们引入了IndexView.as_view()内容,以及把<question_id>改成了<pk>。

下面我们去修改相对应的views。我们把我们老的index、detail、results页面用generic views替换。polls/views.py修改为:

from django.shortcuts import render, get_object_or_404from django.http import HttpResponse, HttpResponseRedirectfrom .models import Question, Choicefrom django.core.urlresolvers import reversefrom django.views import genericclass IndexView(generic.ListView):    template_name = 'polls/index.html'    context_object_name = 'latest_question_list'        def get_queryset(self):        ''' return the last five published questions.'''        return Question.objects.order_by('-pub_date')[:5]    class DetailView(generic.DetailView):    model = Question    template_name = 'polls/detail.html'class ResultsView(generic.DetailView):    model = Question    template_name = 'polls/results.html'        def vote(request, question_id):    #return HttpResponse("You're voting on question %s." % question_id)    question = get_object_or_404(Question, pk=question_id)    try:        selected_choice = question.choice_set.get(pk=request.POST['choice'])    except (KeyError, Choice.DoesNotExist):        # Redisplay the question voting form.        return render(request, 'polls/detail.html', {'question':question, 'error_message':'You did not select a choice'})    else:        selected_choice.votes += 1        selected_choice.save()        # Always return an HttpResponseRedirect after successfully dealing        # with POST data. This prevents data from being posted twice if a        # user hits the Back button.        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))        

在这里,我们引入了两个generic views:ListViewDetailView。这两种view分别实现了“显示对象列表”以及“显示对象详细属性”的功能。
  • 每一个generic view都需要知道它对应的对象类型是什么,用model属性赋值
  • DetailView需要知道对象的pk(从url传入),这也是我们把question_id改成pk的原因
DetailView默认会使用<app name>/<model name>_detail.html页面。如果需要手动设置,则修改template_name属性的值。例如我们分别制定了DetailView和ResultsView的模版名,使得他们虽然类型和model都相同,但是指向的页面不同。
类似的,ListView使用默认模版<app name>/<model name>_list.html,修改的时候同样改变template_name值。

在之前的步骤中,我们都给context变量赋值了我们需要传入的变量(question、latest_question_list之类)。在使用DetailView时,因为我们已经使用了django的model(Question),所以context名称会由django自动设置;而对于ListView,自动生成的context内容会是question_list,如果我们想修改他,那么就覆盖context_object_name属性值为我们想要的变量。当然,你也可以修改你的页面来适应django的默认值,但是显然指定context_object_name会更简单。

就是这些了,去你的server上尝试一下吧~

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝挂失了还有钱没还怎么办 qq号被盗时在是找不回来怎么办 被盗qq通过申诉找不回来怎么办 手机丢了微信的登陆密码忘了怎么办 手机丢了微信钱包有钱怎么办 华为手机微信应用锁密码忘记怎么办 手机丢了微信红包有钱怎么办 手机换号了微信密码忘记怎么办 电脑的宽带连接被删了怎么办 彩票中奖但是彩票老板打错了怎么办 支付宝交手机费没有到账怎么办 支付宝借充电宝丢了怎么办 支付宝还信用卡还没有到账怎么办 支付宝冲话费充错了怎么办 支付宝充话费多久冲错了怎么办 支付宝付款成功商家没收到怎么办 qq钱包被冻结了微信怎么办 q币不小心充多了怎么办 u盘装系统就一个图标怎么办 淘宝买了东西退货客服不理人怎么办 微信10w限额满了怎么办 微信身份证实名认证超出限额怎么办 微信信用卡消费超过当日限额怎么办 淘宝客服同意退货卖家拒绝怎么办 微信钱包充值话费不到帐怎么办 京东买的显示器过保坏了怎么办 支付宝充话费充错号码是空号怎么办 京东充话费充错了号码该怎么办 微信红包充话费不到账怎么办 支付宝充话费等待第三方发货怎么办 微信充话费显示成功但没收到怎么办 微信退款一直在退款中怎么办 文件大于100发不了微信怎么办 微信的传送文件大于100怎么办 微信钱包话费充值错误怎么办 微信转账到不了账也退不回是怎么办 求人办事微信发红包对方不收怎么办 微信上交了订金对方不退怎么办 交通事故对方伤员堵大门搂腿怎么办 电脑开机桌面文件都没了怎么办 qq飞车手游队长换了微信群怎么办