Python Web开发:动态页面渲染
来自CloudWiki
背景
Django提供了方便的ORM操作来对数据库模型进行管理。
当用户在访问荣誉资质页面时,请求通过路由URL分发至views.py文件中的honor()函数进行处理
该函数收到请求后首先从数据库中取出Awars模型的所有数据,然后将数据嵌入到honor.html模板文件中。
实训步骤
视图函数
重新编辑views.py中的honor()函数如下:
from django.shortcuts import render from django.shortcuts import HttpResponse from .models import Award # Create your views here. def survey(request): '''html = '<html><body>企业概况</body></html>' return HttpResponse(html)''' return render(request,'survey.html',{ 'active_menu':'about', 'sub_menu':'survey', }) def honor(request): '''html = '<html><body>荣誉资质</body></html>' return HttpResponse(html)''' awards = Award.objects.all() return render(request,'honor.html',{ 'active_menu':'about', 'sub_menu':'honor', 'awards':awards, })
objects.all()函数:得到一个查询集。
- objects.all()函数:得到一个查询集。
- objects.filter()函数:返回符合条件的数据
- objects.exclude()函数,返回不符合条件的数据
- objects.order_by(),对查询结果集进行排序
- objects.values(),返回一个列表,每个元素为一个字典
- objects.reverse(),对排序的结果反转
- objects.get() 返回一个满足条件的对象,如果没有找到或找到多个,会引发异常
- objects.count() 返回查询集中对象的数目
- objects.first() 返回第一条数据
- objects.last() 返回最后一条数据
- objects.exists() 判断查询的数据是否存在
编辑网页模板
传统静态网页
honor.html :
{% extends "base.html" %} {% load staticfiles %} {% block title %} 荣誉资质 {% endblock %} {% block content %} <!-- 广告横幅 --> <div class="container-fluid"> <div class="row"> <img class="img-responsive model-img" src="{% static 'img/about.jpg' %}"> </div> </div> <!-- 主体内容 --> <div class="container"> <div class="row row-3"> <!-- 侧边导航栏 --> <div class="col-md-3"> <div class="model-title"> 公司简介 </div> <div class="model-list"> <ul class="list-group"> <li class="list-group-item" id="survey"> <a href="{% url 'aboutApp:survey' %}">企业概况</a> </li> <li class="list-group-item" id="honor"> <a href="{% url 'aboutApp:honor' %}">荣誉资质</a> </li> </ul> </div> </div> <!-- 说明文字和图片 --> <div class="col-md-9"> <div class="model-details-title"> 荣誉资质 </div> <div class="row"> <div class="col-sm-6 col-md-4"> <div class="thumbnail"> <img src="{% static 'img/honor1.jpg' %}"> <div class="caption"> <p>2011年加入互联网协会</p> </div> </div> </div> <div class="col-sm-6 col-md-4"> <div class="thumbnail"> <img src="{% static 'img/honor1.jpg' %}"> <div class="caption"> <p>2011年加入互联网协会</p> </div> </div> </div> </div> </div> </div> </div>
动态网页
静态网页是写死的,
动态网页是从数据库调出的动态数据,
因此,为了使网页内容更加灵活,我们更建议使用动态网页。
honor.html:
{% extends "base.html" %} {% load staticfiles %} {% block title %} 荣誉资质 {% endblock %} {% block content %} <!-- 广告横幅 --> <div class="container-fluid"> <div class="row"> <img class="img-responsive model-img" src="{% static 'img/about.jpg' %}"> </div> </div> <!-- 主体内容 --> <!-- 主体内容 --> <div class="container"> <div class="row row-3"> <!-- 侧边导航栏 --> <div class="col-md-3"> <div class="model-title"> 公司简介 </div> <div class="model-list"> <ul class="list-group"> <li class="list-group-item" id="survey"> <a href="{% url 'aboutApp:survey' %}">企业概况</a> </li> <li class="list-group-item" id="honor"> <a href="{% url 'aboutApp:honor' %}">荣誉资质</a> </li> </ul> </div> </div> <!-- 说明文字和图片 --> <div class="col-md-9"> <div class="model-details-title"> 荣誉资质 </div> <div class="row"> {% for award in awards %} <div class="col-sm-6 col-md-4"> <div class="thumbnail"> <img src="{{award.photo.url}}"> <div class="caption"> <p>{{award.description}}</p> </div> </div> </div> {% endfor %} </div> </div> </div> </div> {% endblock %}
上述代码通过{% for award in awards %}语句逐个地读取awards中的每一条数据并赋值到新的临时变量awardz中,每个award都包含一项photo和description 数据。在缩略图中分别使用模板变量{{award.photo.url}}和{{award.description}}对<img>的src属性和段落<p>赋予动态内容。
如何正确地显示图片
上述代码中文字已正常显示,但是图片没有。
原因使debug模式下没有将动态资源路径MEDIA_URL添加到静态路由static下。
编辑配置文件夹hengDaProject下的urls.py文件,添加代码如下:
from django.conf import settings from django.conf.urls.static import static if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)