实训13:影视作品详情页其它模块的实现【附完整代码】

在本实训中,将根据项目中的影视作品详情信息的示例数据文件(项目根目录下的static/jsons/video/vid_changzheng_ds.json)中的相关信息,实现影视作品详情页中的“精彩剧照”、“剧情介绍”、“参考网址”模块。具体步骤如下:

1.修改cz_video_detail.html文件,添加“精彩剧照”模块的模板代码,如图1所示。图1 “影视作品•精彩剧照”模块的模板代码

{% extends "/cz_base.html" %}
{% block title %}{{ video.video_name }}{% endblock %}
{% block main %}
<!--影视作品·作品概览-->
<section class="mt-1">
    <div class="container pt-4">
        <div class="block-title-w">
            <h2 class="block-title">{{ video.video_name }}·作品概览</h2>
            <span class="icon-title">
                <span></span><img src="{{ url_for('static', filename='images/star.png') }}" width="30" height="30">
            </span>
        </div>
        <div class="row">
            <div class="col-md-4 col-sm-6 col-xs-12">
                <img class="img-fluid rounded" src="{{ url_for('static', filename=video.kwargs.video_pic) }}">
            </div>
            <div class="col-md-8 col-sm-6 col-xs-12">
                <h2 class="m-1 text-danger fw-bolder">剧名:{{ video.video_name }}</h2>
                <div class="fs-4 m-2 fw-bold">
                    <a href="#"><span>出品方:{{ video.kwargs.video_publisher }}</span></a>
                    <span class="px-5">创作时间:{{ video.kwargs.video_year }}年</span>
                    <span>地区:{{ video.kwargs.video_origin }}</span>
                </div>
                <div class="fs-4 m-2 fw-bold">
                编剧: {% for w in video.kwargs.video_writer %}<a href="#"><span class="px-3">{{ w }}</span></a>{% endfor %}
                <span class="px-5">导演:
                {% for d in video.kwargs.video_director %}<a href="#"><span class="px-3">{{ d }}</span></a>{% endfor %}
                </span>
                </div>
                <div class="fs-4 m-2 fw-bold">
                主演: {% for s in video.kwargs.video_stars %}<a href="#"><span class="px-3">{{ s }}</span></a>{% endfor %}
                </div>
                <div class="fs-4 m-2 fw-normal">
                    <span>题材分类:{{ video.kwargs.video_catg }}</span>
                    <span class="px-5">语言:{{ video.kwargs.video_language }}</span>
                </div>
                <div class="fs-4 m-2 fw-normal">
                    <span>首映时间:{{ video.kwargs.video_first_play_time }}</span>
                    <span class="px-5">剧集数:{{ video.kwargs.video_sets_num }}</span>
                </div>
                <h4 class="my-4">{{ video.kwargs.video_description }}</h4>
            </div>
        </div>
    </div>
</section>

<!--影视作品·精彩剧照-->
<section class="mt-1 py-4 bg-cz">
    <div class="container">
        <div class="block-title-w">
            <h2 class="block-title">{{ video.video_name }}·精彩剧照</h2>
            <span class="icon-title">
                <span></span>
                <img src="{{ url_for('static',filename='images/star.png') }}" width="30" height="30">
                </span>
        </div>
        <div class="row row-wrap">
            {% for pic in video.kwargs.video_album %}
                <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 item">
                    <div class="inner mb-3">
                        <img src="{{ url_for('static', filename=pic) }}" class="img-fluid rounded" alt="精彩剧照"/>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
</section>

在“精彩剧照”模块的模板代码中,通过一个for循环的控制标签,循环取出精彩剧照列表中每一张图片,加入到一个div标签下的img标签中,通过样式的设置让所有图片在一行中横向排列显示,展示效果如图2所示:

2.修改cz_video_detail.html文件,添加“剧情介绍”模块的模板代码,如图3所示。图3 “影视作品•剧情介绍”模块的模板代码

<!-- 影视作品·剧情介绍 -->
<section class="mt-1 py-4 bg-cz">
    <div class="container py-4">
        <div class="row">
            <div class="block-title-w">
                <h2 class="block-title">{{ video.video_name }} · 剧情介绍</h2>
                <span class="icon-title">
                    <span></span>
                    <img src="{{ url_for('static', filename='images/star.png') }}" width="3o" height="30">
                    </span>
            </div>
            <div class="row">
                {% for story in video.kwargs.video_sets_story %}
                <div class="col-6 col-xs-12 mb-2 p-1">
                    <div class="p-1 h-100 bg-light rounded-3">
                        <div class="fw-bold fs-4 mt-2 text-danger ps-2">
                            <i class="bi bi-camera-video-fill"></i>{{ story.title }}
                        </div>
                        <img class="rounded" width="30%" src="{{ url_for('static', filename=story.image[0]) }}"/>
                        <div class="cz-loss-decs p-2">
                            <a href="{{ story.resourceUrl }}"><p>{{ story.description }}</p></a>
                        </div>
                    </div>
                </div>
                {% endfor %}
            </div>
        </div>
    </div>
</section>

在“剧情介绍”模块的模板代码中,采用通过一个for循环的控制标签,循环取出剧情列表中每一个剧情介绍内容(一个字典结构的数据),加入到一个div标签下的各个子标签中,通过Bootstrap样式的设置使一行中显示两个剧情介绍信息,展示效果如图4所示:图4“影视作品•剧情介绍”模块的页面呈现效果3.修改cz_video_detail.html文件,添加“参考网址”模块的模板代码,以列表形式列出相关的参考网址信息,如图5所示,页面的展示效果如图6所示。图5 “影视作品•参考网址”模块的模板代码

<!-- 影视作品·参考网址 -->
<section class="mt-1 bg-cz">
    <div class="container py-4">
        <div class="block-title-w">
                <h2 class ="block-title">{{video.video_name}}·参考网址</h2>
                <span class="icon-title">
                    <span></span>
                    <img src="{{ url_for('static', filename='images/star.png') }}" width="30" height="30">
                    </span>
        </div>
        <div class="bg-light">
            {%for ref in video.kwargs.video_references %}
            <div class="sub-title fw-bold fs-4 p-3 rounded-4 mb-1">{{loop.index}}. {{ ref }}</div>
            {% endfor %}
        </div>
    </div>
</section>

图6“影视作品•剧情介绍”模块的页面呈现效果4. 目前所实现的影视作品详情页,只能呈现示例数据中提供的电视连续剧“长征”的相关信息,显然是不合理的,因此,接下来将继续修改相关代码,实现对不同的影视作品详情信息进行呈现的功能。首先修改视图函数video_detail_page(),在路由中添加相应变量,要求页面请求时须提供要查看的影视作品的ID及详情数据文件的文件名,在视图函数中根据用户传递过来的参数从对应的详情数据文件中加载数据,并通过render_template()函数渲染到模板文件中;如果因文件不存在等原因造成数据加载不成功,则传递给模板的数据是None,如图5所示。图5 video_detail_page()函数修改后的代码

from flask import Blueprint, render_template

from models.video_models import Video
from utils.load_data import load_data_from_json_file

video = Blueprint('video', __name__, url_prefix='/video')  # 创建名为”video“的蓝图


@video.route('/video_list')
def video_list_page():
    target_file = r"static/jsons/cz_video.json"  # 构造示例数据文件的路径字符串
    # 调用 utils.load_data块下的load_data_from_json_file方法,从json文件加载数据
    video_list = load_data_from_json_file(target=target_file)

    # 利用render_template方法,将相关数据渲染到模板文件中
    return render_template("/video/cz_video_list.html", video_list=video_list)


@video.route('/video_detail/<vid>/<fname>')
def video_detail_page(vid, fname):
    target_file = r"static\jsons\video\\" + fname  # 构造示例数据文件的路径字符串
    # 调用utils.Load_data模块下的Load_data_from_json_file方法,从json文件加载数据
    video_detail = load_data_from_json_file(target=target_file)


    if video_detail and video_detail['videoId'] == vid:
        vd = Video(**video_detail[0])
    else:
        vd = None

    # 利用render_template方法,将相关数据渲染到模板文件中
    return render_template("/video/cz_video_detail.html", video=vd)

5.修改cz_video_detail.html文件,在原来代码的基础上,添加对视图函数传递过来的影视作品详情类对象是否为空的判断,若为空,则在页面中输出合适的提示信息,如图6所示。图6 cz_video_detail.html修改后的代码

{% extends "/cz_base.html" %}
{% block title %}{{ video.video_name }}{% endblock %}
{% block main %}

{% if video %}

    <!--影视作品·作品概览-->
    <section class="mt-1">
        <div class="container pt-4">
            <div class="block-title-w">
                <h2 class="block-title">{{ video.video_name }}·作品概览</h2>
                <span class="icon-title">
                    <span></span><img src="{{ url_for('static', filename='images/star.png') }}" width="30" height="30">
                </span>
            </div>
            <div class="row">
                <div class="col-md-4 col-sm-6 col-xs-12">
                    <img class="img-fluid rounded" src="{{ url_for('static', filename=video.kwargs.video_pic) }}">
                </div>
                <div class="col-md-8 col-sm-6 col-xs-12">
                    <h2 class="m-1 text-danger fw-bolder">剧名:{{ video.video_name }}</h2>
                    <div class="fs-4 m-2 fw-bold">
                        <a href="#"><span>出品方:{{ video.kwargs.video_publisher }}</span></a>
                        <span class="px-5">创作时间:{{ video.kwargs.video_year }}年</span>
                        <span>地区:{{ video.kwargs.video_origin }}</span>
                    </div>
                    <div class="fs-4 m-2 fw-bold">
                    编剧: {% for w in video.kwargs.video_writer %}<a href="#"><span class="px-3">{{ w }}</span></a>{% endfor %}
                    <span class="px-5">导演:
                    {% for d in video.kwargs.video_director %}<a href="#"><span class="px-3">{{ d }}</span></a>{% endfor %}
                    </span>
                    </div>
                    <div class="fs-4 m-2 fw-bold">
                    主演: {% for s in video.kwargs.video_stars %}<a href="#"><span class="px-3">{{ s }}</span></a>{% endfor %}
                    </div>
                    <div class="fs-4 m-2 fw-normal">
                        <span>题材分类:{{ video.kwargs.video_catg }}</span>
                        <span class="px-5">语言:{{ video.kwargs.video_language }}</span>
                    </div>
                    <div class="fs-4 m-2 fw-normal">
                        <span>首映时间:{{ video.kwargs.video_first_play_time }}</span>
                        <span class="px-5">剧集数:{{ video.kwargs.video_sets_num }}</span>
                    </div>
                    <h4 class="my-4">{{ video.kwargs.video_description }}</h4>
                </div>
            </div>
        </div>
    </section>

    <!--影视作品·精彩剧照-->
    <section class="mt-1 py-4 bg-cz">
        <div class="container">
            <div class="block-title-w">
                <h2 class="block-title">{{ video.video_name }}·精彩剧照</h2>
                <span class="icon-title">
                    <span></span>
                    <img src="{{ url_for('static',filename='images/star.png') }}" width="30" height="30">
                    </span>
            </div>
            <div class="row row-wrap">
                {% for pic in video.kwargs.video_album %}
                    <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 item">
                        <div class="inner mb-3">
                            <img src="{{ url_for('static', filename=pic) }}" class="img-fluid rounded" alt="精彩剧照"/>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </section>

    <!-- 影视作品·剧情介绍 -->
    <section class="mt-1 py-4 bg-cz">
        <div class="container py-4">
            <div class="row">
                <div class="block-title-w">
                    <h2 class="block-title">{{ video.video_name }} · 剧情介绍</h2>
                    <span class="icon-title">
                        <span></span>
                        <img src="{{ url_for('static', filename='images/star.png') }}" width="3o" height="30">
                        </span>
                </div>
                <div class="row">
                    {% for story in video.kwargs.video_sets_story %}
                    <div class="col-6 col-xs-12 mb-2 p-1">
                        <div class="p-1 h-100 bg-light rounded-3">
                            <div class="fw-bold fs-4 mt-2 text-danger ps-2">
                                <i class="bi bi-camera-video-fill"></i>{{ story.title }}
                            </div>
                            <img class="rounded" width="30%" src="{{ url_for('static', filename=story.image[0]) }}"/>
                            <div class="cz-loss-decs p-2">
                                <a href="{{ story.resourceUrl }}"><p>{{ story.description }}</p></a>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </section>

    <!-- 影视作品·参考网址 -->
    <section class="mt-1 bg-cz">
        <div class="container py-4">
            <div class="block-title-w">
                    <h2 class ="block-title">{{video.video_name}}·参考网址</h2>
                    <span class="icon-title">
                        <span></span>
                        <img src="{{ url_for('static', filename='images/star.png') }}" width="30" height="30">
                        </span>
            </div>
            <div class="bg-light">
                {%for ref in video.kwargs.video_references %}
                <div class="sub-title fw-bold fs-4 p-3 rounded-4 mb-1">{{loop.index}}. {{ ref }}</div>
                {% endfor %}
            </div>
        </div>
    </section>

{% else %}
    <h2 class="text-center m-5 p-5">对不起,你要査看的影视作品详情信息暂末收录...</h2>
{% endif %}

{% endblock %}

6.修改cz_video_list.html文件,在影视作品列表项的相应位置添加对应的超链接标签<a>,配置其中的href属性,实现点击影视作品列表项中的图片或“查看详情”时跳转到对应的详情页面。如图7所示。图7 cz_video_list.html修改后的代码

{% extends "cz_base.html" %}

{% block title %} 影视作品列表 {% endblock %}

{% block links %}
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/cz_video_style.css') }}">
{% endblock %}

{% block main %}
<div class="album py-5">
  <div class="container">
    <div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3">
      {% for v in video_list %}
      <div class="col">
        <div class="card shadow-sm">
          <a href="{{ url_for('video.video_detail_page',vid=v.video_id,fname=v.video_detail) }}">
          <img class="bd-placeholder-img card-img-top" height="225" src="{{ url_for('static', filename=v.video_pic) }}">
          </a>
          <div class="card-body">
            <p class="card-text">{{ v.video_description }}</p>
            <div class="d-flex justify-content-between align-items-center">
              <div class="btn-group">
                <a href="{{ url_for('video.video_detail_page', vid=v.video_id, fname=v.video_detail) }}"
                   class="btn btn-sm btn-outline-secondary">查看详情</a>
              </div>
              <small class="text-muted h5 fw-bolder">{{ v.video_publisher }}</small>
            </div>
          </div>
        </div>
      </div>
    {% endfor %}
    </div>
  </div>
</div>

{% endblock %}

7.完成以上修改并刷新影视作品列表页面后,如果点击列表页面中的关于电视连续剧“长征”的列表项中的图片或“查看详情”标志,将会跳转到对应的详情页,并且在地址栏的URL中能看到链接地址后面部分是对应的影视作品ID及详情页的文件名,如图8所示。图8 电视连续剧“长征”的详情页页面呈现效果如果点击列表页面中除电视连续剧“长征”的列表项以外的其它列表项,则跳转到详情页面后的呈现效果如图9所示:图9 cz_video_detail.html当详情数据为空时的呈现效果

  • 49
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值