Django实践:Bootstrap设置页面
引言
本文是《Python编程从入门到实践》中使用Django创建一个Web应用的实践记录,简要介绍在一个Django项目中如何使用Bootstrap设置页面的样式。基本步骤:
- Bootstrap简介
- 安装应用程序django-bootstrap3
- 应用Bootstrap设置页面样式
Bootstrap简介
Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的。
Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的。Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品。
Bootstrap资源:
- Bootstrap教程:https://www.runoob.com/bootstrap/
- Bootstrap官网:https://getbootstrap.com/
- Github django-bootstrap3源码:https://github.com/zostera/django-bootstrap3/
安装应用程序django-bootstrap3
安装django-bootstrap3
pip install django-bootstrap3
在settings.py的INSTALLED_APPS = []
中添加应用,让项目包含django-bootstrap3:
INSTALLED_APPS = [
....
'django.contrib.staticfiles',
# 第三方应用程序
'bootstrap3',
# My apps
'users.apps.UsersConfig',
'learning_logs.apps.LearningLogsConfig',
]
让django-bootstrap3包含jQuery,这是一个JavaScript库,能够使用Bootstrap模板提供的一些交互式元素。在settings.py的末尾添加如下代码:
....
# django-bootstrap3的设置
BOOTSTRAP3 = {'include_jquery': True,}
应用Bootstrap设置页面样式
从Bootstrap下载满足需要的样式的模板,在《Python编程从入门到实践》中使用的是Static top navbar模板,然后依据这些模板进行修改,将我们的代码添加进去。如下图是使用Static top navbar对base.html和index.html做微调后的主页效果。
1. 设置base.html样式
使用Bootstrap模板对base.html进行修改,首先在最开始添加{% load bootstrap3 %}
以加载django-bootstrap3的模板标签集。html页面被包含在一对<html> </html>
标记中,主要分为头部(<head> </head>
)和主体(<body> </body>
)两个部分。
其中<head> </head>
文件头主要定义标题及加载一些模板标签,如通过{% bootstrap_css %}
和 {% bootstrap_javascript %}
让Django包含所有Bootstrap的样式文件。
而 <body> </body>
里的文件主体是页面元素主要的定义部分。其中<nav> </nav>
部分是Bootstrap模板中定义导航栏部分,我们在对应位置将原来的base.html中的代码移植过来。接着在<nav> </nav>
标记后的<div></div>
标记中定义页面主要部分,这里我们是添加了两个预留块标记:页面标题({% block header %}{% endblock %}
)和页面内容({% block content %}{% endblock %}
),以便被后续继承的子模板填充具体内容。
{% load bootstrap3 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Learning Log</title>
{% bootstrap_css %}
{% bootstrap_javascript %}
</head>
<body>
<!-- Static navbar -->
<nav class="navbar navbar-default navbar-static-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">
</button>
<a class="navbar-brand" href="{% url 'learning_logs:index' %}">
Learning Log</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="{% url 'learning_logs:topics' %}">Topics</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li><a>Hello, {{ user.username }}.</a></li>
<li><a href="{% url 'users:logout' %}">log out</a></li>
{% else %}
<li><a href="{% url 'users:register' %}">register</a></li>
<li><a href="{% url 'users:login' %}">log in</a></li>
{% endif %}
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<div class="page-header">
{% block header %}{% endblock %}
</div>
<div>
{% block content %}{% endblock %}
</div>
</div> <!-- /container -->
</body>
</html>
2. 使用jumbotron设置index.html样式
在设置index.html样式的时候,使用jumbotron的Bootstrap元素修改主页。
{% extends "learning_logs/base.html" %}
{% block header %}
<div class='jumbotron'>
<h1>Track your learning.</h1>
</div>
{% endblock %}
{% block content %}
<h2>
<a href="{% url 'users:register' %}">Register an account</a> to make
your own Learning Log, and list the topics you're learning about.
</h2>
<h2>
Whenever you learn something new about a topic, make an entry
summarizing what you've learned.
</h2>
{% endblock %}
3. 设置登录页面login.html样式
代码:
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}
{% block header %}
<h2>Log in to your account.</h2>
{% endblock %}
{% block content %}
<form method="post" action="{% url 'users:login' %}" class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button name="submit" class="btn btn-primary">log in</button>
{% endbuttons %}
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
</form>
{% endblock content %}
效果:
4. 设置新建主题页面new_topic.html样式
代码:
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}
{% block header %}
<h2>Add a new topic:</h2>
{% endblock header %}
{% block content %}
<form action="{% url 'learning_logs:new_topic' %}" method='post'
class="form">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button name="submit" class="btn btn-primary">add topic</button>
{% endbuttons %}
</form>
{% endblock content %}
效果:
5. 设置主题页面topics.html样式
代码:
{% extends "learning_logs/base.html" %}
{% block header %}
<h1>Topics</h1>
{% endblock %}
{% block content %}
<ul>
{% for topic in topics %}
<li>
<h3>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</h3>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
<h3><a href="{% url 'learning_logs:new_topic' %}">Add new topic</h3>
{% endblock content %}
效果:
6. 设置主题页面中条目topic.html样式
代码:
{% extends 'learning_logs/base.html' %}
{% block header %}
<h2>{{ topic }}</h2>
{% endblock header %}
{% block content %}
<p>
<a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
</p>
{% for entry in entries %}
<div class="panel panel-default">
<div class="panel-heading">
<h3>
{{ entry.date_added|date:'M d, Y H:i' }}
<small>
<a href="{% url 'learning_logs:edit_entry' entry.id %}">
edit entry</a>
</small>
</h3>
</div>
<div class="panel-body">
{{ entry.text|linebreaks }}
</div>
</div> <!-- panel -->
{% empty %}
There are no entries for this topic yet.
{% endfor %}
{% endblock content %}
效果: