一、安装Django
参考菜鸟教程
二、搭建项目
1.使用命令行(红色部分自定义)
创建项目:django-admin startproject projectname
创建APP(进入工程目录):python manage.py startapp appname
用Pycharm打开这个项目,可以看到文件结构如下
django项目介绍(django项目首次运行会自动生成db.sqlite3文件)
2.使用Pycharm,专业版可以选择Django项目,具体教程百度
我之前用的社区版创建了Project还是需要使用命令行才能创建Django项目
三、项目初步修改
项目中命名不规范会出现绿色波浪线,规范命名,驼峰命名法,或者用下划线隔开,我个人习惯小驼峰
1.首先在项目根目录下创建一个templates目录,用于存放html文件
2.打开myfirst/settings.py,在INSTALLED_APPS下添加最后一行firstweb,即你的app名称,不然运行的时候项目不知道你有firstweb这个东西,没法去找你的views.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'firstweb'
]
3.项目第一次运行之后会创建框架自带的sqlite3文件数据库
4.改语言和时区
默认情况:
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
改为
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
四、我的第一个django项目
功能:实现一个简单的加法计算的功能,并将数据保存到数据库里面 (我使用的是python自带的SQLite数据库 )
1. 新建项目,按照上面的步骤先修改基础设置
运行之后在浏览器打开如下
2. 首先编写html页面,views.py里面的方法,以及urls.py里面的方法,让页面在浏览器上成功显示
html页面,编写了这个页面有啥用呢,没啥用,必须要在views.py中才能让页面显示到浏览器上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算页面</title>
</head>
<body>
<form method="POST" action="result">
第一个数字<input type="number" name="valueA">+
第二个数字<input type="number" name="valueB">
<input type="submit" value="提交计算">
</form>
</body>
</html>
views.py中添加calculate函数,添加了这个函数之后还要在urls中配置路由,浏览器才能通过路由找到这个calculate。request是一个位置参数
def calculate(request):
return render(request,'calculate.html')
urls.py中配置路由cal, 首先要导入views模块
from myWeb import views
urlpatterns = [
path('admin/', admin.site.urls),
path('cal',views.calculate)
]
在浏览器地址栏输入http://localhost:8000/cal,成功显示下列页面
解析步骤,在浏览器中输入地址后,会在项目的urls.py文件中找相应路由,然后调用views模块中的calculate函数,calculate函数通过render渲染页面返回到浏览器
3.接下来实现提交计算之后,让计算结果显示在result.html页面中
首先添加result.html用于显示计算结果,{{}}双括弧中存放变量,这个变量的值是views中的函数传值过来的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算结果</title>
</head>
<body>
<h1>计算结果</h1>
<h1>{{ result }}</h1>
</body>
</html>
在views添加cal函数,此函数用于控制result页面渲染,使用request.POST获取表单post方法提交的数据,context用于给页面传递参数,页面渲染时候会先将result的值拼接到html中,然后再渲染。
def cal(request):
valueA = request.POST['valueA']
valueB = request.POST['valueB']
result = int(valueA) + int(valueB)
return render(request,'result.html',context={'result':result})
在urls.py中添加result的路由
path('result',views.cal)
现在来提交运算,发现出现了这个错误
django中我们需要在templates的form中加入{%csrf_token%},它的作用是当我们get表单页面时,服务器返回页面的同时也会向前端返回一串随机字符,post提交时服务器会验证这串字符来确保用户是在服务端返回的表单页面中提交的数据,防止有人通过例如jquery脚本向某个url不断提交数据,造成数据轰炸,是一种数据提交的验证机制。
现在就成功了
4.现在来实现下一个功能,将计算的数据和结果保存到python自带的sqlite数据库中去
首先在models.py中创建一个cal类
class cal(models.Model):
valueA=models.CharField(max_length=10)
valueB=models.CharField(max_length=10)
result=models.CharField(max_length=10)
数据库选择sqlite,file选择本项目中的sqlite3
test一下connection,发现连接成功
但是只在models.py中创建这个类是没有用的,python中自带数据库中也不会生成我们需要的表,必须要使用python manage.py makemigrations和python manage.py migrate命令
数据库中的表就建好了,如下图中的myWeb_cal,其他的表不用管
接下来修改views.py中的cal函数,让提交计算的同时数据保存到数据库中去
我发现我的models中的表cal和函数重名了,于是我给它取了别名,太尴尬了
from .models import cal as calTable
def cal(request):
valueA = request.POST['valueA']
valueB = request.POST['valueB']
result = int(valueA) + int(valueB)
calTable.objects.create(valueA=valueA,valueB=valueB,result=result)
return render(request,'result.html',context={'result':result})
在页面提交几次运算,再查看数据库表中的数据,已经成功保存到数据库中去了
5.接下来我们让表中的全部数据显示在页面上
新建一个list.html
这里用到了for循环渲染数据,在html中嵌入for循环命令语句,必须要使用endfor结束,否则会报错
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>数据显示</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>valueA</td>
<td>valueB</td>
<td>result</td>
</tr>
</thead>
{% for i in data %}
<tr>
<td>{{ i.valueA }}</td>
<td>{{ i.valueB }}</td>
<td>{{ i.result }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
views.py中新建showList函数,data存储了从数据库中获取的数据
def showList(request):
data=calTable.objects.all()
return render(request,'list.html',context={'data':data})
urls.py中添加
path('list',views.showList)
最终在浏览器中输入地址即可成功显示
5.添加一个删除功能,用来删除所有数据
首先在list.html中添加一个用于提交删除的form表单
<form method="POST" action="del">
{% csrf_token %}
<input type="submit" value="删除所有数据">
</form>
在views中添加用于处理删除数据的方法
def delData(request):
calTable.objects.all().delete()
return HttpResponse('data deleted')
path中添加路由
path('del',views.delData)
运行之后如下图
表中数据也删除了,如下表为空
6.最后做一个小改进,计算出结果的页面是可以直接通过url访问的,虽然会报错,但是应该设置让它不能通过url直接访问,输入地址访问是get请求,即要拒绝它的get请求
在views.py中的cal函数中做一点小改进,如果是post请求,则正常操作,否则响应一下内容
def cal(request):
if request.POST:
valueA = request.POST['valueA']
valueB = request.POST['valueB']
result = int(valueA) + int(valueB)
calTable.objects.create(valueA=valueA,valueB=valueB,result=result)
return render(request,'result.html',context={'result':result})
else:
return HttpResponse('please visit us with post')
再用浏览器直接打开结果网址试试
到此一个简单的django项目就完成了,如有错误敬请指正。