目录
1.Django MTV框架简介
2.基础命令创建项目的配置说明
3.前后端交互案例
4.基于数据库实现数据交互增删改查
Django简介
Django框架的设计模式借鉴了MVC的思想,和MVC不同的点是它拆分的三部分,分别为:(Model)模型、 (Template)模板、以及(View)视图
MVC和MTV知识点补充: MVC是三个单词的首字母缩写,它们是Model模型、View视图 和Controller控制。
1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外 壳。
2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
(ps:这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。)
Django的MTV
Model模型:负责对象与数据库对象(ORM)
Template模板:负责如何把页面展示给用户
View视图:负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view在调用相应的Model和Template
创建一个django项目
1.创建项目 django-admin startproject mysite 2.创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹 mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py 3.启动项目python manage.py runserver #默认使用8000端口 指定端口
python manage.py runserver 8888 #8888为新指定的端口
python manage.py runserver 127.0.0.1:8000 #还可以指定IP和端口,冒号分割 4.创建app
app01/ migrations __init__.py __init__.py admin.py #admin的配置 apps.py # models.py #与数据库交互的时候用orm tests.py #测试 views.py #写函数用 5.数据库迁移
python manage.py makemigrations python manage.py migrate 6.创建超级用户
python manage.py createsuperuser 原理:创建好项目以后需要在setting里面做相应的配置,如果是通过命令创建的项目 那么需要自己额外的创建app(app主要用来写具体的功能),和templates(存放模板文件) 以下是登录密码成功后跳转到成功页面的小案例:1. python manage.py startapp app01 创建app01目录 创建完会自动生成相应的文件2.创建templates目录3.配置settings支持app01和Template
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01.apps.App01Config‘, #添加这行即可 直接引入类]
TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘, ‘DIRS‘: [os.path.join(BASE_DIR,"templates")], #添加这一行,如果是pycharm创建的项目默认是ok的。 ‘APP_DIRS‘: True, ‘OPTIONS‘: { ‘context_processors‘: [ ‘django.template.context_processors.debug‘, ‘django.template.context_processors.request‘, ‘django.contrib.auth.context_processors.auth‘, ‘django.contrib.messages.context_processors.messages‘, ], }, },]
中间件注释csrf才能支持表单提交(测试使用)
MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware‘, ‘django.contrib.sessions.middleware.SessionMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, # ‘django.middleware.csrf.CsrfViewMiddleware‘, ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, ‘django.contrib.messages.middleware.MessageMiddleware‘, ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,]
添加mysql配置 第二个案例用,第一个案例不用跟mysql交互so 可直接忽略
import pymysqlpymysql.install_as_MySQLdb() #一般放在settings同级的init文件中 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘day14‘, ‘HOST‘:"127.0.0.1", "PORT":3306, "USER":‘root‘, "PASSWORD":‘wang‘, }} 修改静态文件存放,为了以后规范化使用
STATIC_URL = ‘/static/‘ #相当于别名STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static")]至此setting告一段落 实例:前后端交互简单案例1修改url分发器,相当于路由,把用户要执行的操作转发到app01下的views里面,当然函数写在哪儿都行but为了规范化写到views里面
from app01 import views 导入views模块 urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login), url(r‘^index/‘, views.index) 写上具体的函数 ]
views里面的代码逻辑
from django.shortcuts import render,redirect,HttpResponse # Create your views here.def index(request): return render(request,‘success.html‘) def login(request): if request.method == ‘POST‘: user = request.POST.get(‘user‘) pwd = request.POST.get(‘pwd‘) if user == ‘admin‘ and pwd == ‘admin‘: #用户登录成功 return redirect(‘/index/‘) else: return render(request, ‘login.html‘,{"error":"用户名或密码错误"}) return render(request,‘login.html‘) 模板文件login.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>登录</title></head><body><form action="" method="post"> <p> <label for="username">用户名</label> <input type="text" id="username" name="user"> </p> <p> <label for="password">密码</label> <input type="password" id="password" name="pwd"> </p> <p> {{error}} </p> <input type="submit" value="登录"></form></body></html> 登录成功后重定向到这个目录下success.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <h1> 登录成功 </h1></body></html> 验证结果:
python manage.py runserver 启动项目
输入用户名密码正确后
否则
连接数据库后的操作
Django 使用mysql数据库配置 1. 创建一个mysql数据库 2. 在settings中配置数据库: 3. 使用pymysql模块连接mysql数据库 在与settings同级目录下的__init__.py中: import pymysql pymysql.install_as_MySQLdb() 4. 创建表,在app下的models.py中写类: from django.db import models # Create your models here. class UserInfo(models.Model): username = models.CharField(max_length=32) # varchar(32) password = models.CharField(max_length=32) #注释表示删除 5. 执行数据库迁移的命令 python manage.py makemigrations # 创建迁移文件 记录上models.py的变更记录 python manage.py migrate # 执行迁移数据库
orm具体操作:
ret = models.Publisher.objects.all() # 查询所有的数据 对象列表
for i in ret:
print(i,type(i)) # 对象 对应数据库一条数据
print(i.name,i.id) # 属性 字段的值
models.Publisher.objects.filter(name=publisher_name) 查不到就是空列表
models.Publisher.objects.create(name=publisher_name) 新增
models.Publisher.objects.filter(id=id).delete() 删除
修改
publisher_name = request.POST.get(‘publisher_name‘)
# 编辑
pub_obj.name = publisher_name # 只在内存中有变化
pub_obj.save() # 保存修改到数据库
模板
{% for pub in ret %}
<tr>
<td>{{ pub.id }}</td>
<td>{{ pub.name }}</td>
</tr>
{% endfor %}
基于数据库实现怎删改查操作实例
1. 查询在数据库读取数据然后在前端文件显示 models.py文件配置 from django.db import models class Pulisher(models.Model): name = models.CharField(max_length=32) #创建表和字段 python manage.py makemigrations python manage.py migrate 完了在表里面自行添加几条记录为了展示效果 在url分发器添加执行的函数名 rlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login), url(r‘^index/‘, views.index), url(r‘^publisher_list/‘, views.publisher_list) #名字对应views里面的函数名 views里面的函数逻辑 from app01 import models #需要导入models模块,基于这个模块来实现后续操作 def publisher_list(request): ret = models.Pulisher.objects.all() # for i in ret: # print(i,type(1)) # print(i.name,i.id) return render(request,‘publisher_list.html‘,{"ret":ret}) publisher_list.html模板文件配置 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>出版社列表</h1> <table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> </tr> </thead> <tbody> {% for pub in ret %} <tr> <td> {{pub.id}} </td> <td> {{pub.name}} </td> </tr> {% endfor %} </tbody> </table> </body> </html> 结果展示:
ps: 由于我建表的时候publisher_list少写了一个字母,所以后导入models模块的时候名字要一样,否则会报错。
2. 添加实例
models里面添加表
class Pulisher(models.Model): name = models.CharField(max_length=32) urls添加函数名
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login), url(r‘^index/‘, views.index), url(r‘^publisher_list/‘, views.publisher_list), url(r‘^add_publisher/‘, views.add_publisher)] views里面写具体的实现逻辑,如果添加的字段存在提示即可,如果不存在则添加
def add_publisher(request): if request.method == ‘POST‘: publisher_name = request.POST.get("publisher_name") ret = models.Pulisher.objects.filter(name=publisher_name) if ret: return render(request, "add_publisher.html",{"error":"出版社名称已存在"}) models.Pulisher.objects.create(name=publisher_name) return redirect("/publisher_list/") return render(request,"add_publisher.html")
add_publisher.html 里面的代码
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="" method="post"> <p> <label for="">出版社名称</label> <input type="text" name="publisher_name"><span>{{error}}</span> </p> <button>新增</button></form></body></html>
结果展示
添加不存在的直接添加并展示出添加后的结果
3.删除例子
urls添加函数名
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login), url(r‘^index/‘, views.index), url(r‘^publisher_list/‘, views.publisher_list), url(r‘^add_publisher/‘, views.add_publisher), url(r‘^del_publisher/‘, views.del_publisher)] views里面的函数逻辑
def del_publisher(request): id = request.GET.get("id") #这里的GET是url携带的参数 models.Pulisher.objects.filter(id = id).delete() return redirect("/publisher_list/") publisher_list.html 文件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><h1>出版社列表</h1><table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> <th>操作</th> </tr> </thead> <tbody> {% for pub in ret %} <tr> <td> {{pub.id}} </td> <td> {{pub.name}} </td> <td><a href="/del_publisher/?id={{pub.id}}">删除</a></td> </tr> {% endfor %} </tbody></table></body></html>验证结果:访问地址直接点击删除即可。
4.修改操作 urls添加函数
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login), url(r‘^index/‘, views.index), url(r‘^publisher_list/‘, views.publisher_list), url(r‘^add_publisher/‘, views.add_publisher), url(r‘^del_publisher/‘, views.del_publisher), url(r‘^edit_publisher/‘, views.edit_publisher),] views里面函数逻辑
def edit_publisher(request): id = request.GET.get("id") pub_list = models.Pulisher.objects.filter(id=id)#拿到对象列表 print(pub_list) pub_obj = pub_list[0] print(pub_obj) if request.method == "POST": publisher_name = request.POST.get("publisher_name") pub_obj.name = publisher_name pub_obj.save() #保存修改到数据库 return redirect("/publisher_list/") return render(request,"edit_publisher.html",{"pub_obj":pub_obj}) publisher_list原有的基础上添加:
<a href="/edit_publisher/?id={{pub.id}}">编辑</a></td>
edit_publisher.html文件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="" method="post"> <p> <label for="">出版社名称</label> <input type="text" name="publisher_name" value="{{pub.obj.name}}"><span>{{error}}</span> </p> <button>保存</button></form></body></html> 完成!
原文地址:https://www.cnblogs.com/guniang/p/11188675.html