出现吧,Python Web 菜谱系统的首页,不会前端技术,也能做

橡皮擦,一个逗趣的互联网高级网虫。新的系列,让我们一起进入 Django 世界。

已经完成的文章

七、出现吧,Python Web 菜谱系统的首页

7.1 菜谱系统首页初始化

滚雪球第三轮核心学习的是 Python Web 相关知识点,那不可避免的会涉及到前端技术栈,如果你对 HTML,CSS 完全零基础,学习来可能比较吃力,建议可以先补充一些前端知识,便于后续学习,你也可以先直接进入 Django 学习阶段,问题不大。

本篇博客开始构建菜谱系统的前端页面,基本涉及的知识就是网页模板框架与前端,优先会从用户可鉴权系统开始编写,上篇博客的模型相关内容,先放一下,不久就要继续使用。

下面开始编写首页部分前端代码,我们选择的是 BootStrap3 框架,这个框架接受起来比较容易一些。

在 Django 中实现一个页面,需要两个步骤,第一步,创建模板 HTML 文件,第二步,修改 views.py 文件,完成视图处理函数。

创建目录和文件

menuapp 应用目录下创建 templates 文件夹,然后该目录下继续创建一个 menuapp 的子目录,有点绕,看图。

2021040122265640[1].png

接下来在 templates/menuapp 目录中新建一个 index.html 的文件,该页面就是首页的模板文件,以下为代码部分,涉及了前端相关知识点。
肯定有人问,难道代码都是自己敲出来的吗?这肯定不是,如果这样,没有前端知识,咱就学不下去了,这些内容是修改出来的。
打开 Bootstrap3 模板页,在里面选择一个模板,例如下面的内容。

20210401222915861[1].png

在打开的页面中,点击鼠标右键选择查看源码,在源码页面复制你要的内容,去掉里面相对路径相关部分代码,例如下述内容。

<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="../../assets/js/ie10-viewport-bug-workaround.js"></script>

这种 ../../ 的都要去除,就得到了最终的源码部分。

20210401222957693[1].png
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <meta name="description" content="" />
    <meta name="author" content="" />
    <link rel="icon" href="../../favicon.ico" />

    <title>Jumbotron Template for Bootstrap</title>
    <!-- Bootstrap core CSS -->
    <link
      href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
      rel="stylesheet"
    />
  </head>

  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button
            type="button"
            class="navbar-toggle collapsed"
            data-toggle="collapse"
            data-target="#navbar"
            aria-expanded="false"
            aria-controls="navbar"
          >
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Project name</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <form class="navbar-form navbar-right">
            <div class="form-group">
              <input type="text" placeholder="Email" class="form-control" />
            </div>
            <div class="form-group">
              <input
                type="password"
                placeholder="Password"
                class="form-control"
              />
            </div>
            <button type="submit" class="btn btn-success">Sign in</button>
          </form>
        </div>
        <!--/.navbar-collapse -->
      </div>
    </nav>

    <!-- Main jumbotron for a primary marketing message or call to action -->
    <div class="jumbotron">
      <div class="container">
        <h1>Hello, world!</h1>
        <p>
          This is a template for a simple marketing or informational website. It
          includes a large callout called a jumbotron and three supporting
          pieces of content. Use it as a starting point to create something more
          unique.
        </p>
        <p>
          <a class="btn btn-primary btn-lg" href="#" role="button"
            >Learn more &raquo;</a
          >
        </p>
      </div>
    </div>

    <div class="container">
      <!-- Example row of columns -->
      <div class="row">
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>
            Donec id elit non mi porta gravida at eget metus. Fusce dapibus,
            tellus ac cursus commodo, tortor mauris condimentum nibh, ut
            fermentum massa justo sit amet risus. Etiam porta sem malesuada
            magna mollis euismod. Donec sed odio dui.
          </p>
          <p>
            <a class="btn btn-default" href="#" role="button"
              >View details &raquo;</a
            >
          </p>
        </div>
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>
            Donec id elit non mi porta gravida at eget metus. Fusce dapibus,
            tellus ac cursus commodo, tortor mauris condimentum nibh, ut
            fermentum massa justo sit amet risus. Etiam porta sem malesuada
            magna mollis euismod. Donec sed odio dui.
          </p>
          <p>
            <a class="btn btn-default" href="#" role="button"
              >View details &raquo;</a
            >
          </p>
        </div>
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>
            Donec sed odio dui. Cras justo odio, dapibus ac facilisis in,
            egestas eget quam. Vestibulum id ligula porta felis euismod semper.
            Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum
            nibh, ut fermentum massa justo sit amet risus.
          </p>
          <p>
            <a class="btn btn-default" href="#" role="button"
              >View details &raquo;</a
            >
          </p>
        </div>
      </div>

      <hr />

      <footer>
        <p>&copy; 2016 Company, Inc.</p>
      </footer>
    </div>
    <!-- /container -->

    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>

    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </body>
</html>

模板文件编写完毕之后,就可以尝试运行 Django 网站,实现我们最终的目标了。

运行前,还需要做一些准备工作,第一个就是修改默认首页。

编辑下图 urls.py 文件。

20210401223311863[1].png

修改代码如下:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # 将 menuapp 应用的 URL 设置包含到项目的 URL 设置中
    path("", include("menuapp.urls"))
]

Django 一般建议为每个不同的 APP 应用单独设计 URL 文件,所以还需要在 menuapp 文件中,新增一个 urls.py 文件,也就是上述代码引用的部分 path("", include("menuapp.urls")),代码位置如下图所示。

20210401223444990[1].png

文件中的代码如下:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="defalut"),
]

当访问默认路径的时候,即 http://127.0.0.1:8000/,会调用 views 模块中的 index 方法,所以还需要修改 views.py 文件,代码如下:

from django.shortcuts import render
# Create your views here.
def index(request):
    return render(request, "menuapp/index.html")

到这里,才发现模板文件被正式加载了。

接下来就可以使用 python manage.py runserver 运行我们的应用了,但是又出现问题了,即下述错误。

20210401221700452[1].png

该错误表示模板文件没有加载到,有两个原因,第一个是模板文件的位置,注意是在 menuapp 应用目录下,如果还不确定,请返回上文查找图示,第二种原因是,我们还没有在 settings.py 中把 menuapp 加入到 settings.INSTALLED_APPS 里面去,导入无法加载应用,修改 settings.py 文件,代码如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'menuapp'
]

此时在运行代码,如果成功出现如下界面,表示模板文件正式加载完毕。

20210401224010438[1].png

7.2 菜谱系统静态文件迁移

在上文代码的 index.html 文件中,使用了如下内容,这些内容都是调用的 CDN 加速网址的链接(全面学过前端之后,可以在补充这部分知识),这些地址的完全决定权,不在我们手中,所以接下来需要将下述内容修改为菜谱项目静态文件中。

<link
  href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
  rel="stylesheet"
/>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

打开 Bootstrap 3 官方网站,提前下载源码素材,下载地址:https://github.com/twbs/bootstrap/releases/download/v3.3.7/bootstrap-3.3.7-dist.zip

创建静态文件目录与文件
将下载好的文件拷贝到 static 目录,最终的结果如下图所示。

2021040208350282[1].png

接下来就是如何在 Django 模板文件中去应用静态文件相关知识点了。
第一步:在需要使用静态文件的模板页首行插入 {% load static %} 语句。
第二步:在后续使用静态文件的地方使用 static 标签加上路径即可,例如使用 bootstrap.min.js 文件,语句为 {% static 'js/bootstrap.min.js' %}
第三步:上述路径会因为 settings.py 中设置的 STATIC_URL 值加上路径值,成为最终的地址,例如 static/js/bootstrap.min.js
第四步:在 urls.py 中增加静态文件处理代码

上述步骤涉及的代码文件修改内容如下:
index.html 修改完善

{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>菜谱系统----首页</title>
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">

</head>

<body>
 <!-- 其余部分与上文一致 -->

</div> <!-- /container -->

<script src="{% static 'js/bootstrap.min.js' %}"></script>

</body>
</html>

urls.py 文件修改如下,注意该文件是项目目录的,不是 menuapp 应用目录

from django.contrib import admin
from django.urls import path, include
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    path('admin/', admin.site.urls),
    # 将 menuapp 应用的 URL 设置包含到项目的 URL 设置中
    path("", include("menuapp.urls"))
]
urlpatterns += staticfiles_urlpatterns()

重新使用 python manage.py runserver 运行程序,浏览页面看到数据正常即可。

7.3 Django 模板语言

在上文使用的 {% 语句部分 %} 就是 Django 中的模板语言,模板与普通的文本文件有两个不一样的地方,模板包含变量,该变量在页面渲染网页的时候,会被替换为相应的值,模板中还包括逻辑处理代码,这部分知识叫做标签。

变量在模板中使用双花括号表示 {{ 变量名 }},这里变量相关知识还涉及筛选器内容,后文都会有所涉及。

模板中的标签使用 {% %} 进行表示,标签中可以包含业务逻辑代码,有时也会存在开始标签和结束标签。

例如实现 if 语句的标签,写法如下:

<ul>
  {% if menu %}
  <li>{{ menu.name }}</li>
</ul>
{% endif %}

模板语言中使用 block 和 extends 两个标签实现继承,简单理解就是一堆公共模板。

父模板中使用 block 进行占位,子模板中使用 extends 进行继承。

7.3.1 拆分模板

接下来对模板进行拆分,将 index.html 文件中的头部提取出来。在 templates/menuapp 目录下创建一个新文件。

20210402155800191[1].png

其中 frame.html 代码如下,只展示最核心部分,否则文章就太长了,注意 frame.html 为父模板,其中 {% block title %}{% endblock%} 为占位符,{% block content %}{% endblock %} 为占位符。

{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <title>{% block title %}{% endblock%}</title>
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet" />
  </head>

  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <!-- 里面内容省略 -->
      </div>
    </nav>

    <!-- Main jumbotron for a primary marketing message or call to action -->
    <div class="jumbotron">
      <!-- 里面内容省略 -->
    </div>

    {% block content %}{% endblock %}

    <script src="{% static 'js/bootstrap.min.js' %}"></script>
  </body>
</html>

index.html 文件代码如下:

{% extends "menuapp/frame.html" %} {% block title %} 菜谱系统---- 首页 {%
endblock %} {% block content %}
<div class="container">代码内容</div>
<!-- /container -->
{% endblock %}

views.py 文件源码依旧未变,具体如下:

from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request, "menuapp/index.html")

此时运行效果如下:

20210402160750428[1].png

7.4 本篇博客小节

本篇博客主要介绍的是 Django 中的最简单首页制作,尽量在无前端知识铺垫的情况下,帮助你学习 Python Web 相关知识,喜欢就点个赞吧。

相关阅读

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 游戏世界(更新中,目标文章数 50+,现在订阅,都是老粉)
  3. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 <font color="red">124</font> / 200 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 <font color="red">梦想橡皮擦</font>,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。

<font color=white size=1>
django微信小程序商城 Django 教程 2020年php凉透了
django和spring比较 django开源项目 为什么大公司很少用vue
python的django框架 django怎么安装 django企业开发实战pdf
</font>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容