Django 添加视图

Django 添加视图,现在网站的后台管理模块已经可以工作了,还缺少前台页面。投票系统需要以下页面:

  • 首页——展示最新的调查问卷。
  • 详细页面——具体问卷展示页,不显示投票结果但是可以进行投票。
  • 结果展示页——展示某一问卷的调查结果。
  • 投票——处理某一次投票。

在Django中每一个页面或者其他内容都是通过视图呈现出来的,每一个视图就是一个Python函数或者方法。Django通过URL确定调用哪一个视图,Django的URL相较于早期网站的URL更加简洁优雅。

Django通过URLconfs将URL模式字符串与视图关联起来,URL模式字符串就是一个URL的一般形式,如/newsarchive/<year>/<month>/
下面在polls/views.py文件中添加以下视图:

def detail(request, question_id):
    return HttpResponse("讲为你打开问卷 %s。" % question_id)
def results(request, question_id):
    response = "正在查看问卷 %s 的结果。"
    return HttpResponse(response % question_id)
def vote(request, question_id):
    return HttpResponse("请为问卷 %s 提交你的答案。" % question_id)

修改polls.urls文件,添加以下URL映射:
Django 添加视图

重启Web服务器,在浏览器中访问http://127.0.0.1:8000/polls/24/,如图所示。
Django 添加视图

继续访问http://127.0.0.1:8000/polls/24/results/http://127.0.0.1:8000/polls/24/vote/,可见同样能够正常显示视图内容。

Django能够正常调用解析URL是因为在settings.py中设置了ROOT_URLCONF = 'mysite.urls'。当用户访问的URL包含polls/时,Django会根据mysite.urls中的设置,跳转到polls.urls并进行验证,直到找到第一个匹配的URL为止。

以上视图中参数question_id的值来自于<int:question_id><int:question_id>用于匹配URL中的值,并将捕捉到的值作为关键字参数传递给视图,其中,question_id>对应视图的参数,<int决定了URL中的哪类值符合匹配条件。

丰富视图功能

每一个视图都应该负责一个具体的业务逻辑,视图执行结束会返回一个包含页面内容的HttpResponse对象或者异常信息。

下面修改index视图使它返回最新的5条调查问卷。

from .models import Question
    def index(request):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        output = ', '.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

代码Question.objects.order_by('-pub_date')是Django的数据库API语法,用于从数据库中查找数据。

访问index页面查看显示情况,如图所示。
Django 添加视图

此时调查问卷已经在网页上显示,但是可以发现在index视图中使用了硬编码,如果想要修改网页显示样式就需要重新编写Python代码。Django提供了一套模板系统(templates),可以将业务逻辑与页面显示样式分离。接下来看看如何使用模板系统。

首先在polls文件夹下创建一个新文件夹templates,为了目录结构清晰,在templates文件夹下再创建一个polls文件夹,最后在polls下创建一个index.html文件。这个index.html就是即将应用于index视图的模板。
在settings.py中有一个关于模板的配置项:TEMPLATES。

将下面代码写入模板文件index.html:
Django 添加视图

接下来重新修改index视图:
Django 添加视图

新视图会从模板文件夹下加载模板文件并将一个字典对象传入视图。
重启Web服务器,重新查看index页面,如图所示。
Django 添加视图

上面代码的工作原理是先使用loader方法加载视图,然后HttpResponse方法初始化一个HttpResponse对象并返回给浏览器。对于很多Django视图来说,它们的工作原理都是这样的,因此Django提供了一个简写函数render。下面使用render函数重写index视图:
Django 添加视图

此时重新访问index,可以发现页面效果一样。

当引用render包之后,代码中将不再需要loader和HttpResponse包。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!