发布学习django的第一个项目
- 2019 年 10 月 6 日
- 筆記
Python Web之Django初识
0.导语
最近看到很多人在学django,我就来发一篇这方面的文章,本文的项目地址请点击阅读原文,即可跳转,欢迎star,fork!
1.安装及配置
#0 安装: pip3 install django #1 创建project: django-admin startproject mysite ---mysite ---settings.py # 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。 ---url.py # 路由 负责把URL模式映射到应用程序。 ---wsgi.py # 协议 ---- manage.py(启动文件) # Django项目里面的工具,通过它可以调用django shell和数据库等。 #2 在mysite目录下创建blog应用: python manage.py startapp blog ---blog ---__init__.py ---admin.py ---apps.py ---migrations ---__init__.py ---models.py ---tests.py ---views.py #3 启动django项目: python manage.py runserver 8080 #4 生成同步数据库的脚本: python manage.py makemigrations 同步数据库: python manage.py migrate #5 访问后台管理系统: 为进入这个项目的后台创建超级管理员: python manage.py createsuperuser,设置好用户名和密码后便可登录啦! http://127.0.0.1:8080/admin/ #6 清空数据库: python manage.py flush #7 查询某个命令的详细信息: django-admin.py help startapp #8 启动交互界面: python manage.py shell 这个命令和直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。 #9 查看详细的列表: python manage.py
2.hello django及显示时间实例
# urls.py 添加path('show_time/', views.show_time), # 修改views(视图) # **每一个视图必须有一个形参,客户端/浏览器发送服务器之后,服务器返回浏览器打包的信息对象,全在request里面** 1.效果一:访问页面显示hello # **导入HttpResponse,HttpResponse('hello')返回给前端的实例对象** def show_time(request): return HttpResponse('hello') 2.效果二:访问页面显示hello,hello封装到模板index.html中。 def show_time(request): return render(request,"index.html") 3.效果三:访问页面显示hello django,并显示当前时间 def show_time(request): t=time.ctime() # 将字符串time以键值对绑定当前时间点,并发送给前端,前端index.html中{{time}}将time对应的内容渲染出来 return render(request,"index.html",{'time':t}) # 新增index.html(放置templates下面): <div> <!--两个大括号去渲染一个变量--> hello {{ time }} </div> 访问记得:http://localhost:端口/show_time
3.引用资源文件(例如引用jquery)
方法一:settings别名
settings.py
# 前端用的这个别名(虚拟路径),是对后面statics的替换,为了维护方便 STATIC_URL = '/static/' # 别名 # 以下为添加的内容,注意元组/列表填写路径,否则报错 # 物理路径/绝对路径 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'statics'), )
/templates/index.html
<div id="div1"> <!--两个大括号去渲染一个变量--> hello {{ time }} </div> // 注意这里访问jquery文件时,必须用别名访问,否则报错,资源找不到。 <script src="/static/jquery-3.3.1.js"></script> <script> $('#div1').css("color",'red') </script>
总结
先在根目录下定义一个statics包文件夹,然后在下面放置jquery资源文件,为了让django读取到此文件,则必须更改settings.py中相关设置,在settings.py把statics添加进去,看上述代码,注意别名问题,所谓别名就是为了维护方便,在所有HTML处引用时只需使用别名访问,而不管资源文件(比如jquery)文件名的不断改变。若用资源文件名(例如将上述/statci改为/statics)则报错,资源文件找不到!!! #django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找 #<script src="/statics/jquery-3.1.1.js"></script> #------error-----不能直接用,必须用STATIC_URL = '/static/': #<script src="/static/jquery-3.1.1.js"></script>
方法二:
不能去掉settings.py上面加的STATICFILES_DIRS meta标签下加
{% load staticfiles %}
form表单里面加
<script src={% static "jquery-3.3.1.js" %}></script>
位置如下: <div id="div1"> <!--两个大括号去渲染一个变量--> hello {{ time }} </div> <script src={% static "jquery-3.3.1.js" %}></script> <script> $('#div1').css("color",'red') </script>
4.提交数据并展示
userInfor.html
<h1>创建个人信息</h1> <form action="/userInfor/" method="post"> <p>姓名<input type="text" name="username"></p> <p>性别<input type="text" name="sex"></p> <p>邮箱<input type="text" name="email"></p> <p><input type="submit" value="submit"></p> </form> <hr> <h1>信息展示</h1> <table border="1"> <tr> <td>姓名</td> <td>性别</td> <td>邮箱</td> </tr> {% for i in info_list %} <tr> <td>{{ i.username }}</td> <td>{{ i.sex }}</td> <td>{{ i.email }}</td> </tr> {% endfor %} </table>
url.py
url(r'^userInfor/', views.userInfor)
views.py
info_list=[] def userInfor(req): if req.method=="POST": username=req.POST.get("username",None) sex=req.POST.get("sex",None) email=req.POST.get("email",None) info={"username":username,"sex":sex,"email":email} info_list.append(info) return render(req,"userInfor.html",{"info_list":info_list})
dos下运行python manage.py runserver 8000 http://localhost:8000/userInfor/ 在使用Django提交Post表单时遇到如下错误:
Forbidden (403) CSRF verification failed. Request aborted.
解决方法:
1、在表单Form里加上{% csrf_token %} <form action="/index/" method="post"> {% csrf_token %} ...... 2、在Settings里的MIDDLEWARE增加配置:(一般默认就有) 'django.middleware.csrf.CsrfViewMiddleware', 我的版本是Django2.0.3,如果是以前版本,则为MIDDLEWARE_CLASSES配置。 3.在views中的方法上面加上@csrf_exempt(记得引入包)注解 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def userInfor(req): ............. 另一种办法就是直接注释掉settings.py >MIDDLEWARE>'django.middleware.csrf.CsrfViewMiddleware',
5.提交数据至数据库,并在后台管理操作
5.1原版
# 首先创建django项目,其项目目录如下: exa ---dbreq ---migrations ---__init__.py ---admin.py ---apps.pyy ---models.py ---tests.py ---views.py ---exa ---__init__.py ---settings.py ---urls.py ---wsgi.py ---templates ---userInfor.html ---db.sqlites ---manage.py
/templates/userInfor.html
<h1>创建个人信息</h1> <form action="/userInfor/" method="post"> {% csrf_token %} <p>姓名<input type="text" name="username"></p> <p>性别<input type="text" name="sex"></p> <p>邮箱<input type="text" name="email"></p> <p><input type="submit" value="submit"></p> </form> <hr> <h1>信息展示</h1> <table border="1"> <tr> <td>姓名</td> <td>性别</td> <td>邮箱</td> </tr> {% for i in info_list %} <tr> <td>{{ i.username }}</td> <td>{{ i.sex }}</td> <td>{{ i.email }}</td> </tr> {% endfor %} </table>
/exa/urls.py
# 添加以下代码 path('userInfor/', views.userInfor),
/dbreq/views.py
from django.shortcuts import render from dbreq import models from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def userInfor(req): if req.method == "POST": u = req.POST.get("username", None) s = req.POST.get("sex", None) e = req.POST.get("email", None) info={"username":u,"sex":s,"email":e} models.UserInfor.objects.create(**info) info_list=models.UserInfor.objects.all() return render(req, "userInfor.html", {"info_list":info_list}) return render(req, "userInfor.html")
models.py
# 创建数据库 from django.db import models # Create your models here. class UserInfor(models.Model): username=models.CharField(max_length=64) sex=models.CharField(max_length=64) email=models.CharField(max_length=64)
以上.py文件写完后,生成表
# 生成相应的表: python manage.py makemigrations python manage.py migrate
为项目后台数据库设置账户
python manage.py createsuperuser
此时运行python manage.py runserver 8088,然后http://localhost:8088/admin 登录账户后,会发现无表,此时需要对admin.py进行修改
# admin.py from django.contrib import admin # Register your models here. from dbreq import models # 把models创建的表添加到admin后台中 admin.site.register(models.UserInfor)
此时后台如下界面:

此时进行增加数据操作
http://127.0.0.1:8000/userInfor/
页面创建表,后台实时更新成功,如图!


5.2更新版
更新内容
1.数据库后台修改了一行数据并添加了一行; 2.增加show页面,将原先提交的数据可在另一个页面访问到 3.删除数据并呈现操作 4.更新数据并呈现数据
5.2.1 show页面
urls.py
path('show/', views.show),
views.py
def show(req): info_list=models.UserInfor.objects.all() # 取出该表所有数据 return render(req,'show.html',{'info_list':info_list})
show.html
<table border="1"> <thead> <tr> <td>姓名</td> <td>性别</td> <td>邮箱</td> </tr> </thead> <tbody> {% for i in info_list %} <tr> <td>{{ i.username }}</td> <td>{{ i.sex }}</td> <td>{{ i.email }}</td> </tr> {% endfor %} </tbody> </table>
python manage.py runserver

5.2.2 delData页面
urls.py
path('delData/', views.delData),
views.py
# 删除操作 @csrf_exempt def delData(req): # 删除数据 info_list = models.UserInfor.objects.filter(username='哈哈哈') return render(req, "show.html", {"info_list": info_list})
python manage.py runserver

5.2.3 updateData页面
urls.py
path('updateData/', views.updateData),
views.py
# 修改操作 @csrf_exempt def updateData(req): models.UserInfor.objects.filter(username='哈哈哈').update(sex='女',email='[email protected]') info_list = models.UserInfor.objects.all() return render(req,"show.html",{"info_list":info_list})
python manage.py runserver
