Django 入门教程,练习做个疫情可视化地图
共 8754字,需浏览 18分钟
·
2021-11-20 08:50
1
初识Django
我使用的 Python 版本是 3.8,先执行下面语句先安装 Django
pip install Django
安装完成后,执行下面语句创建 Django 项目
django-admin startproject duma
项目的名称可以自定义,我创建的项目名是 duma。
命令执行完毕后,在当前目录会生成 duma 目录,该目录包含以下源文件。
duma/
manage.py
duma/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
简单介绍下这几个文件的作用:
manage.py: 管理 Django 项目的命令行工具,就像一个工具箱,后面会经常用到
mysite/settings.py:Django 项目的配置文件,如:配置该项目使用什么数据库、包含哪些应用等
mysite/urls.py:Django 项目的 URL 声明
mysite/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。暂时用不到
mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。暂时用不到
后面的学习中,我们会使用、修改这上面的文件,那时候对他们的作用会有更深的体会。
运行下面命令,启动web服务,验证 duma 项目是否创建成功。
python manage.py runserver
执行命令,会看到有以下信息输出
Starting development server at http://127.0.0.1:8000/
在浏览器访问 http://127.0.0.1:8000/
看到上面的页面,说明项目创建成功。
接下来我们要在 duma 项目中创建一个应用(app)。一个项目里可以有多个应用,如电商项目里可以有商城应用、支付应用和会员应用等等。
执行这行命令,创建一个应用
python manage.py startapp ncov
这里创建了一个名为 ncov 的应用,用它来做一个疫情数据报告。项目根目录会发现有个 ncov 目录,包含以下文件
ncov/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
先不介绍它们的作用,这些文件后面基本都会用到,到时候会详细介绍。
2
Hello, World
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello, World!')
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('ncov/', include('ncov.urls')),
]
3
连接数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
from django.db import models
class CyStat(models.Model):
stat_dt = models.CharField(max_length=10) # 日期
cy_name = models.CharField(max_length=50) # 国家名称
confirm = models.IntegerField() # 累计确诊
dead = models.IntegerField() # 累计死亡
heal = models.IntegerField() # 累计治愈
today_confirm = models.IntegerField() # 现有确诊
today_new_confirm = models.IntegerField() # 新增确诊
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ncov.apps.NcovConfig' # 注册 ncov 应用
]
python manage.py makemigrations ncov
Migrations
for 'ncov':
ncov/migrations/0001_initial.py
- Create model CyStat
python manage.py sqlmigrate ncov 0001
BEGIN;
--
-- Create model CyStat
--
CREATE TABLE "ncov_cystat" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "stat_dt" varchar(10) NOT NULL, "cy_name" varchar(50) NOT NULL, "confirm" integer NOT NULL, "dead" integer NOT NULL, "heal" integer NOT NULL, "today_confirm" integer NOT NULL, "today_new_confirm" integer NOT NULL);
COMMIT;
python manage.py migrate
sqlite3 db.sqlite3
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups ncov_cystat
auth_user_user_permissions
4
编写web页面
sqlite> insert into ncov_cystat(stat_dt, cy_name, confirm, dead, heal, today_confirm, today_new_confirm) VALUES ("2021-09-03", "cn", 123169, 5685, 115024, 2460, 33);
sqlite> insert into ncov_cystat(stat_dt, cy_name, confirm, dead, heal, today_confirm, today_new_confirm) VALUES ("2021-09-04", "cn", 123199, 5685, 115105, 2409, 30);
...
from django.shortcuts import render
from .models import CyStat
def index(request):
cy_stats = CyStat.objects.filter(cy_name='cn').order_by('-stat_dt')[:7]
context = {
'cy_stats': cy_stats
}
return render(request, 'ncov/index.html', context)
<h3>国内疫情数据h3>
<table border="1">
<tr>
<td>日期td>
<td>现有确诊td>
<td>新增确诊td>
tr>
{% for stat in cy_stats %}
<tr>
<td> {{ stat.stat_dt }} td>
<td> {{ stat.today_confirm }} td>
<td> {{ stat.today_new_confirm }} td>
tr>
{% endfor %}
table>
from django.http import HttpResponse
from django.shortcuts import render
from pyecharts.charts import Line, Map
from pyecharts import options as opts
from .models import CyStat
def index(request):
cy_stat = CyStat.objects.filter(cy_name='cn').order_by('-stat_dt')[:14]
stat_list = [x.stat_dt for x in cy_stat]
stat_list.reverse()
today_confirm_list = [x.today_confirm for x in cy_stat]
today_confirm_list.reverse()
today_new_confirm_list = [x.today_new_confirm for x in cy_stat]
today_new_confirm_list.reverse()
c = (
Line()
.add_xaxis(stat_list)
.add_yaxis("现有确诊", today_confirm_list)
.add_yaxis("新增确诊", today_new_confirm_list)
.set_global_opts(title_opts=opts.TitleOpts(title="国内疫情数据"))
)
return HttpResponse(c.render_embed())
还不过瘾?试试它们