网站开发(周五):项目前端页面开发(实战)

第一、前端基础简介

前端网页:根据此前项目需求分析可知,我们需要开发网站首页、文章分类页、搜索页、正文页、标签页,而一个最基本网页模版有三部分,网页顶部导航条、网页中部主体、网页底部,其中顶部和底部布局固定,中部展示内容每张网页不同。

网页代码:我们知道,网页模板的基本代码的顶部和底部相同,主要中部主体在变化。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>mysite2019</title>
</head>
<body>
<div>顶部</div>

<div>中部</div>

<div>底部</div>

</div>
</body>
</html>

模板继承:我们把所有网页相同的代码单独提取出来放在 base.html页面里,然后在代码不同的位置,也就是主体那里用模板标签{% block content %} {% endblock %}替换。

templates/base.html   #父模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>mystie2019</title>
</head>
<body>
<div>顶部</div>

{% block content %}

{% endblock %}

<div>底部</div>

</div>
</body>
</html>

网站首页:在实现首页模板的时候,我们通过下面的代码实现,组合成一个完整的首页。{% extends "base.html" %} 的意思是继承 base.html页面的代码,且这个代码一定要放页面的第一行。两个页面里都有代码{% block xxx %}{% endblock %} ,代码{% block xxx %}{% endblock %} 里的xxx可以自由命名,这个代码意思是告诉模板引擎:这个位置我要预留给别人放东西的。一般是父模版基础代码被引用到子模板中,结合子模板的主体内容,形成一个网整网页,有效解决代码冗余、代码重复修改。

templates/index.html  #子模板

{% extends "base.html" %}
{% block content %}
<div>中部</div>
{% endblock %}

网页样式:{% block %} 标签非常有用,一般来说,基础模板中的 {% block %} 标签越多越好,用起来也会更灵活。例如,子模板要多引用一个CSS样式文件,这个样式只需要应用在当前页面。我们可以在base.html模板里多加一个{% block  css %} {% endblock %}标签,然后在子模板页面里加以引用,如此一来,这个CSS就只在当前页面生效。

{% block  css %}

#CSS样式文件路径
<link href=‘{% static "css/style.css" %}‘ type=‘text/css‘ />

{% endblock %}

第二、网页需求分析

结合此前的项目需求分析,我们需要实现五个页面的展现。网站首页、文章分类列表页、搜索列表页、标签列表页、文章内容展示页,这里,我们增加一个单页面(网站声明)。其中,文章分类列表页、搜索列表页、标签列表页这三个页面展示结构都一样,我们只需要一个模板页面即可。所以说我们真正需要实现的只有4个页面,这四个页面分别对应前端模板里的首页(index.html)、列表页(list.html)、内容页(show.html)、单页(page.html)。

1、我们把前端设计师做好的静态模板static移动到mysite2019根目录里,然后把index.html、list.html、show.html、page.html四个页面复制到项目下templates目录里(之前做测试时templates目录里的index.html删除掉)。

2、通过观察,我们发现四个页面的头部和尾部相同,只有中间主体部分不同,通过继承,我们把相同部分的代码放到base.html。

templates/base.html      #父模板
{% load staticfiles %}
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-dns-prefetch-control" content="on"/>
    <meta http-equiv="X-UA-Compatible" content="IE=11,IE=10,IE=9,IE=8">
    <meta name="viewport"
    content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="apple-mobile-web-app-title" content="Hydra,Hacker学院">
    <title>Hacker学院</title>

<link rel=‘stylesheet‘ id=‘bootstrap-css‘ href=‘{% static "css/bootstrap.min.css" %}‘ type=‘text/css‘ media=‘all‘/>
<link rel=‘stylesheet‘ id=‘fontawesome-css‘ href=‘{% static "css/font-awesome.min.css" %}‘ type=‘text/css‘ media=‘all‘/>
<link rel=‘stylesheet‘ id=‘stylesheet-css‘ href=‘{% static "css/style.css" %}‘ type=‘text/css‘ media=‘all‘/>
<link rel=‘stylesheet‘ id=‘raxus-css‘ href=‘{% static "css/raxus.css" %}‘ type=‘text/css‘ media=‘all‘/>
<link rel=‘stylesheet‘ id=‘open-social-style-css‘ href=‘{% static "css/os.css" %}‘ type=‘text/css‘ media=‘all‘/>
    <meta name=‘robots‘ content=‘index,follow‘/>
    <meta name="keywords" content="网络安全、网络攻防、网络渗透">
    <meta name="description" content="追踪黑客前沿咨询,速递最新、最猛、最价值的黑客科技资讯!">
</head>
<body class="home blog site-layout-2">
<!-- 顶部 -->
<header class="fix-wrap" id="fix-wrap">
    <div class="fix-main clearfix pr" id="fix-main" _hover-ignore="1"><a href="/" class="index-logo">
        <img src="{% static "picture/logo2.png" %}" alt="Hacker学院"></a>
        <nav class="nav fl">
            <ul id="fix-list" class="fix-list clearfix">
                <li id="menu-item-24086" class="menu-item"><a href="/">首页</a></li>
                {% for category in allcategory %}
                    <li id="menu-item-117720" class="menu-item">
                        <a href="{% url ‘index‘ %}list-{{ category.id }}.html">{{ category.name }}</a></li>
                {% endfor %}
                <li id="menu-item-24086" class="menu-item"><a href="/about/">网站声明</a></li>
            </ul>
        </nav>
        <form method="get" class="index-search  hidden-xs" action="/s/">
            <input class="text" name="search" type="text" placeholder="输入关键字" value="">
            <button class="submit" type="submit"><i class="fa fa-search"></i></button>
        </form>
    </div>
</header>

{% block content %}

{% endblock %}

<!-- 底部 -->
<footer class="footer">
    <div class="copyright"> ? 2010- 2019 · All Rights Reserved
        · <a href="https://www.cnblogs.com/linlei1234/">博客园</a>
        · <a href="http://www.miibeian.gov.cn" target="_blank">粤ICP备27022490号</a> 版权所有 ? 博客园
    </div>
</footer>
<script src="{% static "js/bundle.js" %}"></script>
<script type="text/javascript" src="{% static "js/view-history.js" %}"></script>
<script type=‘text/javascript‘ src="{% static "js/push.js" %}"></script>
<script type=‘text/javascript‘ src=‘{% static "js/jquery.min.js" %}‘></script>
<script type=‘text/javascript‘ src=‘{% static "js/bootstrap.min.js" %}‘></script>
<script type=‘text/javascript‘ src=‘{% static "js/raxus-slider.min.js" %}‘></script>
<script type=‘text/javascript‘ src=‘{% static "js/loader.js" %}‘></script>
<script type=‘text/javascript‘ src=‘{% static "js/bj-lazy-load.min.js" %}‘></script>
<script type=‘text/javascript‘ src=‘{% static "js/os.js" %}‘></script>

</body>
</html>

3、index.html、list.html、show.html、page.html四个页面,删除底部底部相同代码,剩下中部主体代码,再在四个子模板基础上继承父模板,形成完整页面。

templates/index.html、list.html、show.html、page.html

{% extends "base.html" %}
{% block content %}
#中部主体代码
{% endblock %}

4、其中list.html和show.html这两个页面的右侧部分和index.html右侧除“热门文章排行"部分之外,样式布局都一样,我们将其提取,放到right.html页面里,原来的位置我们用下面的代码{% include ‘right.html‘ %}替代,代表在此位置引入right.html代码。

{% load staticfiles %}    #引入样式文件
<section class="widget post-right-item">
    <h4 class="post-right-title">热门推荐</h4>
    <ul class="post-hot clearfix">
        {% for k in remen %}
            <li>
                <div class="img">
                    <a href="{% url ‘index‘ %}show-{{ k.id }}.html" title="{{ k.title }}">
                        <img src="{% url ‘index‘ %}media/{{ k.img }}" srcset="{% url ‘index‘ %}media/{{ k.img }}" alt="{{ k.title }}"
                             class="wp-post-image" width="120" height="80"/>
                    </a>
                </div>
                <div class="text">
                    <a href="{% url ‘index‘ %}show-{{ k.id }}.html" title="{{ k.title }}"
                       target="_blank">{{ k.title }}</a>
                </div>
            </li>
        {% endfor %}
    </ul>
</section>

</section>
<section class="widget post-right-item"><h4 class="post-right-title">所有标签</h4>
    <div class="tags">
        {% for tag in tags %}
            <a href="{% url ‘index‘ %}tag/{{ tag.name }}">{{ tag.name }}</a>
        {% endfor %}
    </div>
</section>
</section><!-- /关注我们 -->
<div class="post-right-item">
    <h4 class="post-right-title">关注我们</h4>
    <div class="wid-about">
        <p>博主微信,欢迎交流!</p>
        <img src="{% static "picture/weixin.jpg" %}" alt="微信二维码" width="160" height="160">
    </div>
    <div class="wid-about">
        <p><strong>联系方式:</strong></p>
        <p>Phone: 15622333821</p>
        <p>Email:[email protected]</p>
    </div>
</div>

5、修改base.html页面,引入样式文件,形成最终模板(点击下载)。

第三、修改配置文件

1、在mysite2019/urls.py,给六个页面都设置一个URL,并添加别名。

2、在blog/views.py,写六个视图函数,与mysite2019/urls.py文件里的六个url一一对应。

from django.shortcuts import render
from blog.models import Category,Banner, Article, Tag, Link
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

#优化代码,减少冗余
def global_variable(request):
    allcategory = Category.objects.all()
    remen = Article.objects.filter(tui__id=2)[:6]
    tags = Tag.objects.all()
    return locals()

#首页
def index(request):
    banner = Banner.objects.filter(is_active=True)[0:4]
    tui = Article.objects.filter(tui__id=1)[:3]
    allarticle = Article.objects.all().order_by(‘-id‘)[0:6]
    hot = Article.objects.all().order_by(‘views‘)[:10]
    link = Link.objects.all()
    return render(request, ‘index.html‘, locals())

#列表页
def list(request,lid):
    list = Article.objects.filter(category_id=lid)
    cname = Category.objects.get(id=lid)
    page = request.GET.get(‘page‘)
    paginator = Paginator(list, 5)
    try:
        list = paginator.page(page)#获取当前页码的记录
    except PageNotAnInteger:
        list = paginator.page(1)#如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        list = paginator.page(paginator.num_pages)#如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容
    return render(request, ‘list.html‘, locals())

#内容页
def show(request,sid):
    show = Article.objects.get(id=sid)
    hot = Article.objects.all().order_by(‘?‘)[:10]
    previous_blog = Article.objects.filter(created_time__gt=show.created_time,category=show.category.id).first()
    netx_blog = Article.objects.filter(created_time__lt=show.created_time,category=show.category.id).last()
    show.views = show.views + 1
    show.save()
    return render(request, ‘show.html‘, locals())

#标签页
def tag(request, tag):
    list = Article.objects.filter(tags__name=tag)
    tname = Tag.objects.get(name=tag)
    page = request.GET.get(‘page‘)
    paginator = Paginator(list, 5)
    try:
        list = paginator.page(page)  # 获取当前页码的记录
    except PageNotAnInteger:
        list = paginator.page(1)  # 如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        list = paginator.page(paginator.num_pages)  # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容
    return render(request, ‘tags.html‘, locals())

# 搜索页
def search(request):
    ss=request.GET.get(‘search‘)
    list = Article.objects.filter(title__contains=ss)
    page = request.GET.get(‘page‘)
    paginator = Paginator(list, 10)
    try:
        list = paginator.page(page)  # 获取当前页码的记录
    except PageNotAnInteger:
        list = paginator.page(1)  # 如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        list = paginator.page(paginator.num_pages)  # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容
    return render(request, ‘search.html‘, locals())

# 关于我们
def about(request):
    return render(request, ‘page.html‘,locals())

3、打开mysite2019/settings.py,找到TEMPLATES,在里面添加索引代码。

至此,网站前端后台均创建完毕!

接下来,对网站进行运行测试。

原文地址:https://www.cnblogs.com/linlei1234/p/10322778.html

时间: 2024-10-10 21:32:40

网站开发(周五):项目前端页面开发(实战)的相关文章

堡垒机项目实战-批量任务的前端页面开发

onclick="ItmToggle(this)" function ItemToggle(ele) { $(ele).next.toggle() } 隐藏显示切换 JS:trim() 去空格 Ajax另一种方式:$.post("{% url ' ' %}" ,data , function(){ }); python:request.POST.getlist() 获取列表 原文地址:https://www.cnblogs.com/jintian/p/1136693

play(三) play实例项目开发Yabe 2前端页面

1.通过作业加载测试数据: 为了加载测试的数据,我们可以使用下面方法:在application启动时候,加载一个fixture文件.因此,我们创建Bootstrap作业.Play中的作业的概念是:不需要获得HTTP请求,而可以自己执行的任务.(类似ETL调度作业). BasicTest.java import models.User; import play.jobs.Job; import play.jobs.OnApplicationStart; import play.test.Fixtu

超实用python小项目--基于python的手机通讯录二维码生成网站--1、项目介绍和开发环境

这个项目是我做完整的第一个python web项目,对于新手来说,这个项目绝对是一个特别好的练手项目. 起名还是困难,但是自己确实比较烦输入这么长的名字(手机通讯录二维码生成网站)去定义这个网站,所以还是给这个项目起个名字吧,叫什么呢?就叫 "鹅日通讯录"吧(Earth address list). --------------------------------------------------------------------------------------------我是

移动前端页面开发需要注意的20个要点

1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用 <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"> <meta content="yes" name="apple-mobile-web-ap

【原创】结合公司网站首页,谈前端模块化开发与网站性能优化实践

说在前面 上午给大家分享的个人认为比较全,比较官方,比较清晰的grunt使用教程,被挪出首页了,不过没关系,毕竟不是原创,大家想看,我现在贴出地址: http://www.cnblogs.com/sybboy/p/4877055.html 下面可是我自己的东西,算是这段时间搞前端架构的总结吧: 目录 1.遇到的问题 2.目标 3.如何解决 4.结果分析 5.尚未解决 6.说在后面 遇到的问题 问题1----脚本混乱,没有层次和固定代码位置 问题2----脚本和css请求较多,请求未压缩,文件未压

js学习总结----crm客户管理系统之前端页面开发及数据渲染

具体代码如下: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="css/index.css" charset='utf-8'> </h

在前端页面开发中所遇到的问题总结

首先,项目中往往时间的原因,无法将整个项目的代码完完整整的通读一遍,而且将整个代码完全理解透也不切实际.而且很多情况下一期项目完后,很少有人会将项目内的代码完完整整的进行关键性注释.这个时候针对性模块理解起到了一定的关键作用. 针对自己在项目中要增加.修改的模块花些时间进行理解很重要,而且因为时间原因,一旦遇到了不理解的地方不能一直死盯着,需要合理的跳过.很多项目中,模块之间是相互联系的,虽然在此模块中不能将一部分代码理解,但是往往到另一个模块中却会惊奇的发现:之前模块中遇到的不理解的代码片段在

Android 开发第一项目——计算器的开发记录

2017.4.1 今天布局界面基本完成,现在写了一点事件绑定.计划是多用动态绑定,随时用随时改.关于布局方面,昨天弄到很晚,原因是Layout使用错误,用的自带的,没仔细看,预览的时候没有问题但是真机调试就出错.是兼容性问题,很多的安卓系统不支持constrainlayout(6.0不支持不要问我为什么知道).改用LinearLayout,简单嵌套了一下,主体还是用了几个LinearLayout分别写了每一行,其中用了几个LinearLayout用来调整按钮间隙.然后稍微调了字号和对齐方式.

vue+node开发手机端h5页面开发遇到的坑

一 css 1.文字超过span宽度显示...(单行文字) .topWrap .introduce span { padding: 0 17px; display: inline-block; border-radius: 5px; height: 18px; line-height: 18px; margin-top: 15px; max-height: 18px; max-width: 90%; white-space:nowrap; text-overflow:ellipsis; over