教程来自 Python Crash Course 2nd.
主要内容:接上一篇django 实现用户账户功能后,使用Bootstrap设置应用样式
目录
1. 安装django-bootstrap4
pip install django-bootstrap4
添加到settings.py中
INSTALLED_APPS = [
# My apps.
‘polls.apps.PollsConfig‘,
‘learning_logs‘,
‘users‘,
# Third party apps.
‘bootstrap4‘,
# Default django apps.
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
]
2. 使用Bootstrap
如Navbar static
模板
3. 修改base.html
3.1 定义HTML头部
语言设置:zh-CN
修改前:
<p>
<a href="{% url ‘learning_logs:index‘ %}">学习笔记</a> -
<a href="{% url ‘learning_logs:topics‘ %}">主题</a> -
{% if user.is_authenticated %}
你好,{{ user.username }}.
<a href="{% url ‘users:logout‘ %}">注销</a>
{% else %}
<a href="{% url ‘users:register‘ %}">注册</a> -
<a href="{% url ‘users:login‘ %}">登录</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
删除上述代码,写入:
{% load bootstrap4 %}
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>学习笔记</title>
{% bootstrap_css %}
{% bootstrap_javascript jquery=‘full‘ %}
</head>
其中,<!doctype html>
声明这是HTML文件,<html lang="zh-CN">
将语言设置为中文。
head
包含有关文档且未显示在屏幕上的信息元素。title
表示标签页标题。
3.2 定义导航栏
body
包含 web 页中所有显示的元素,部分常用标签:
-
<h1>A heading</h1>
最重要的标题 -
<h2>A sub-heading</h2>
下一层级的标题! -
<h3>A sub-sub-heading</h3>
... 同样,直到<h6>
-
<em>text</em>
强调文本 -
<strong>text</strong>
强烈强调文本 -
<br />
跳转到下一行(不能放任何东西在br里面) -
<a href="链接URL">link</a>
创建一个链接 -
<ul><li>first item</li><li>second item</li></ul>
产生一个列表 -
<div></div>
定义页面上的一个段
接上部分:
<body>
<nav class="navbar navbar-expand-md navbar-light bg-light mb-4 border">
<a class="navbar-brand" href="{% url ‘learning_logs:index‘%}">
学习笔记
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarCollapse" aria-controls="navbarCollapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<nav>
元素表示页面的导航连接部分,其中的所有内容都根据选择器navbar
,navbar-expand-md
等定义的Bootstrap
样式规则来设置样式。选择器决定了特定样式规则将应用于页面上的哪些元素。
<button>
按钮在浏览器窗口太窄、无法水平显示整个导航栏时显示,点击按钮导航元素将以下拉列表形式出现。
接下来打开导航栏新的部分并定义了一个新的链接集合(这里只有一个链接到主题页面的项):
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url ‘learning_logs:topics‘ %}">
主题
</a>
</li>
</ul>
接下来是用户已登录和未登录时的导航栏显示:
<ul class="navbar-nav ml-auto">
{% if user.is_authenticated %}
<li class="nav-item">
<span class="navbar-text">你好,{{ user.username }}.</span>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url ‘users:logout‘ %}">注销</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url ‘users:register‘ %}">注册</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url ‘users:login‘ %}">登录</a>
</li>
{% endif %}
</ul>
</div>
</nav>
3.3 定义页面的主要部分
<main role="main" class="container">
<div class="pb-2 mb-2 border-bottom">
{% block page_header %}{% endblock page_header %}
</div>
<div>
{% block content %}{% endblock content %}
</div>
</main>
</body>
</html>
4. 使用Jumbotron设置主页样式
login.html
{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}
{% block page_header %}
<h2>登入你的账号</h2>
{% endblock page_header %}
{% block content %}
<form method="post" action="{% url ‘users:login‘ %}" class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button name="submit" class="btn btn-primary">登录</button>
{% endbuttons %}
<input type="hidden" name="next"
value="{% url ‘learning_logs:index‘ %}" />
</form>
{% endblock content %}
5. 设置主题页面样式
topics.html
{% extends "learning_logs/base.html" %}
{% block page_header %}
<h1>主题</h1>
{% endblock page_header %}
{% block content %}
<ul>
{% for topic in topics %}
<li><h3>
<a href="{% url ‘learning_logs:topic‘ topic.id %}">{{ topic }}</a>
</h3></li>
{% empty %}
<li><h3>当前还没有添加过主题。</h3></li>
{% endfor %}
</ul>
<h3><a href="{% url ‘learning_logs:new_topic‘ %}">添加一个新主题</a></h3>
{% endblock content %}
6. 设置主题页面的条目样式
topic.html
{% extends "learning_logs/base.html" %}
{% block page_header %}
<h3>{{ topic }}</h3>
{% endblock page_header %}
{% block content %}
<p>
<a href="{% url ‘learning_logs:new_entry‘ topic.id %}">添加新条目</a>
</p>
{% for entry in entries %}
<div class="card mb-3">
<h4 class="card-header">
{{ entry.date_added|date:‘Y-m-d H:m:s‘ }}
<small><a href="{% url ‘learning_logs:edit_entry‘ entry.id %}">
编辑条目</a></small>
</h4>
<div class="card-body">
{{ entry.text|linebreaks }}
</div>
</div>
</li>
{% empty %}
<li>当前主题还没有添加过条目。</li>
{% endfor %}
{% endblock content %}
7. 设置条目页面样式
new_entry.html
{% extends "learning_logs/base.html" %}
{% block page_header %}
<h3><a href="{% url ‘learning_logs:topic‘ topic.id %}">{{ topic }}</a></h3>
{% endblock page_header %}
{% block content %}
<p>添加新条目:</p>
<form action="{% url ‘learning_logs:new_entry‘ topic.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">添加条目</button>
</form>
{% endblock content %}
edit_entry.html
{% extends "learning_logs/base.html" %}
{% block page_header %}
<h3><a href="{% url ‘learning_logs:topic‘ topic.id %}">{{ topic }}</a></h3>
{% endblock page_header %}
{% block content %}
<p>编辑条目:</p>
<form action="{% url ‘learning_logs:edit_entry‘ entry.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">保存改动</button>
</form>
{% endblock content %}
8. 页面效果
主页:
主题页:
条目页:
条目编辑页面: