第一部分 基于admin模块实现基本功能
1 新建PyCharm项目
新建PyCharm项目,设置虚拟环境(使用Virtualenv虚拟环境隔离器、Python3.7解析器)
等待片刻,完成PyCharm项目的新建,详见下图。
编辑代码,测试鸡兔同笼算法
编辑main.py文件,点击右上角三角形运行代码,测试鸡兔同笼计算题的算法。
def compute_rabbits_chickens(a,b):
"""
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
:param a:头的个数
:param b:脚的个数
:return x,y: 鸡的个数和兔的个数
"""
for x in range(1,a):
y = a - x
if 2 * x + 4 * y == b:
return x,y
if __name__ == '__main__':
a = 35
b = 94
x,y = compute_rabbits_chickens(a,b)
print("鸡有" + str(x) + "只,兔有" + str(y) + "只。")
2 安装Python模块
在Terminal终端输入以下命令,安装模块
pip install django django-simpleui django-crispy-forms
3 新建Django项目和Django应用
在Terminal终端输入以下命令,新建名字为lubangongju的Django项目
django-admin startproject lubangongju .
说明:注意最后有个英文空格和英文句号点[ .],表明在Termianl终端当前的目录下新建Django项目。
**
4 修改Django项目配置文件
修改项目的配置文件settings.py
# 项目包含的应用和模块
INSTALLED_APPS = [
# 第三方模块,必须第一行增加,是个admin页面的ui模块
'simpleui',
# django的内置模块
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 第三方模块,是个form页面的ui模块
'crispy_forms',
# 自建的应用模块
'compute.apps.ComputeConfig',
]
LANGUAGE_CODE = 'zh-hans' # 中文
TIME_ZONE = 'Asia/Shanghai' # 上海时区
# django-crispy-forms配置为使用bootstrap3样式
CRISPY_TEMPLATE_PACK = 'bootstrap3'
5 把Django应用名字修改成中文
修改应用的配置文件apps.py
from django.apps import AppConfig
# compute应用的配置
class ComputeConfig(AppConfig):
name = 'compute'
verbose_name = '计算模型'
6 在Django应用中新建数据表
修改models.py文件
from django.db import models
# 鸡兔同笼计算题的计算函数
def compute_rabbits_chickens(a,b):
"""
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
:param a:头的个数
:param b:脚的个数
:return x,y: 鸡的个数和兔的个数
"""
for x in range(1,a):
y = a - x
if 2 * x + 4 * y == b:
return x,y
class Rabbits_and_chickens(models.Model):
"""
鸡兔同笼数据表模型
"""
a = models.BigIntegerField(verbose_name="头的个数")
b = models.BigIntegerField(verbose_name="脚的个数")
x = models.BigIntegerField(blank=True,null=True, verbose_name="鸡的个数")
y = models.BigIntegerField(blank=True,null=True, verbose_name="兔的个数")
r = models.TextField(blank=True, default="",verbose_name="结果说明")
class Meta:
verbose_name = "鸡兔同笼"
verbose_name_plural = "鸡兔同笼"
# 重写模型的save方法
def save(self, *args, **kwargs):
# 调用鸡兔同笼计算函数(输入a和b,输出x,y),设置当前模型的x,y,r的数值
self.x,self.y= compute_rabbits_chickens(self.a,self.b)
self.r = "鸡有" + str(self.x) + "只,兔有" + str(self.y) + "只。"
# 调用模型的父类save方法, Call the "real" save() method.
super().save(*args, **kwargs)
# 为了让显示的内容更直观更易懂,返回实例对象的打印字符串。
def __str__(self):
return "头有" + str(self.a) + "个,脚有" + str(self.b) + "个。"
7 同步数据库
在terminal窗口输入以下命令,生成数据库迁移脚本,并执行迁移脚本
python manage.py makemigrations
python manage.py migrate
8 配置admin管理后台
修改admin.py文件,配置管理后台页面的显示项
from django.contrib import admin
from .models import Rabbits_and_chickens
# 模型的显示样式
class Rabbits_and_chickens_Admin(admin.ModelAdmin):
list_display = ('a', 'b', 'r') # 列表页只显示a,b,r
# 管理后台注册(模型,模型显示样式)
admin.site.register(Rabbits_and_chickens,Rabbits_and_chickens_Admin)
# 设置管理后台的网页标题和系统名称
admin.site.site_header = "鲁班工具云计算平台"
admin.site.site_title = '鲁班工具云计算平台'
9 创建管理员账号
在terminal窗口输入以下命令,创建用户名为admin密码为123456的超级用户账号
python manage.py createsuperuser
admin
admin@admin.com
123456
123456
y
10 运行系统
在teminal窗口输入:
python manage.py runserver
访问链接http://127.0.0.1:8000/admin,运行”鲁班工具云计算平台”
第二部分 基于模板语言实现更自由的展示页面
11 新建模板文件
在compute应用文件夹中,新建templates文件夹;然后在templates文件夹中,新建compute文件夹。
在compute/templates/compute文件夹中,新建home.html文件(平台主页)
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>鲁班工具云计算平台</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">
鲁班工具云计算平台
</h1>
<div class="col-md-8 col-md-offset-2">
<ul>
<li>
<a href="{% url 'rabbits_and_chickens_list' %}">鸡兔同笼计算</a>
</li>
</ul>
</div>
</div>
</div>
</body>
</html>
新建rabbits_and_chickens_list.html文件(鸡兔同笼计算题列表页)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>鲁班工具云计算平台</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<table class="table">
<caption class="text-center"><h1>鸡兔同笼-计算数据列表</h1></caption>
<thead>
<tr>
<th>头数</th>
<th>脚数</th>
<th>结果</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for object in object_list %}
<tr>
<td>{{object.a}}</td>
<td>{{object.b}}</td>
<td>{{object.r}}</td>
<td>
<a class="btn btn-primary" href="{% url 'rabbits_and_chickens_create' %}">新增</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-primary" href="{% url 'rabbits_and_chickens_create' %}">新增</a>
<a class="btn btn-primary" href="{% url 'home' %}">返回首页</a>
</div>
</div>
</div>
</body>
</html>
新建rabbits_and_chickens_form.html文件(鸡兔同笼计算题数据提交页)
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>鲁班工具云计算平台</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">
鸡兔同笼
</h1>
<h3 class="text-center">
鸡兔同笼的来源,解法说明,相关资料的链接
</h3>
<div class="col-md-8 col-md-offset-2">
<form class="form-horizontal" role="form" method="post">
{% csrf_token %}
{{ form |crispy }}
<input type="submit" class='btn btn-primary' value="提交">
<a class="btn btn-primary" href="{% url 'rabbits_and_chickens_list' %}">返回鸡兔同笼列表</a>
</form>
</div>
</div>
</div>
</body>
</html>
12 新建视图函数
修改views.py文件(接收http请求、并返回http响应的视图函数类)
from django import forms
from django.views.generic import ListView, CreateView, TemplateView
from django.urls import reverse_lazy
from .models import Rabbits_and_chickens
# 平台首页,函数类调用home.html模板,显示计算题列表(get方法)
class HomeView(TemplateView):
template_name = 'compute/home.html'
# 鸡兔同笼计算题的列表页,函数类调用rabbits_and_chickens_list.html模板(传Rabbits_and_chickens数据值给模板并渲染),
# 显示提交过得计算数据和结果(get方法)
class RabbitsAndChickensListView(ListView):
model = Rabbits_and_chickens
template_name = 'compute/rabbits_and_chickens_list.html'
# 鸡兔同笼的form表单,用来表单数据校验、表单数据保存,用于下面的函数类调用
class RabbitsAndChickensForm(forms.ModelForm):
class Meta:
model = Rabbits_and_chickens
fields = ['a', 'b']
# 鸡兔同笼计算题的输入提交页,函数类调用RabbitsAndChickensForm表单和rabbits_and_chickens_form.html模板文件,
# 先显示计算题的输入框(get方法),提交数据后执行数据项的保存(post方法),执行成功后跳转到列表页
class RabbitsAndChickensCreateView(CreateView):
model = Rabbits_and_chickens
template_name = 'compute/rabbits_and_chickens_form.html'
form_class = RabbitsAndChickensForm
success_url = reverse_lazy('rabbits_and_chickens_list')
13 新建路由
修改项目的urls.py文件(网址路由和执行函数的关系映射)
from django.contrib import admin
from django.urls import path
from compute import views as compute_views
# 配置网址路由和视图函数的映射关系
urlpatterns = [
path('', compute_views.HomeView.as_view(), name='home'),
path('admin/', admin.site.urls),
path('compute/rabbits_and_chickens/list/', compute_views.RabbitsAndChickensListView.as_view(), name='rabbits_and_chickens_list'),
path('compute/rabbits_and_chickens/create/', compute_views.RabbitsAndChickensCreateView.as_view(), name='rabbits_and_chickens_create'),
]
14 运行系统
在teminal窗口输入以下命令,运行程序
python manage.py runserver
访问链接http://127.0.0.1:8000,运行”鲁班工具云计算平台”
15 思考
1)计算模型的数据models中增加用户字段,每次提交时候保存当前用户的信息。登录后提交数据的用户,只能看到自己的历史计算数据;没有登录的匿名用户,看不到历史数据。
2)新增页面中,增加计算题的说明和描述,可以是图片或者文字。
3)新增提交后,先返回计算过程和结果页面,再跳转到列表页面。
4)列表页面中,增加删除和修改历史数据的功能。
5)改成手机自适应的响应式
6)增加小程序的访问功能