初始Django
初始Django |
一、MVC和MTV模式
MVC:将web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。
模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。
Django的MTV模型本质上与MVC没有什么差别,也是各组件之间为了保持松耦合关系,只不过定义上有些不同,Django的MTV分别是:
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模板):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
二、Django框架的安装与使用
1.安装
目前在企业开发中Django框架使用的主流版本为1.11.x版本,所有我们使用1.11.x版本的,不过现在最新版本为2.x 。
pip3 install django==1.11.18 #在命令行执行该命令
2.使用
如果使用的是我们自定义的框架来开发web应用,需要事先生成框架包含的一系列基础文件,
然后在此基础上进行开发。
如果使用的是Django框架来开发web应用,同样需要事先生成Django框架包含的一系列基础
文件,然后在此基础上进行开发。
但Django框架更为方便的地方在于它已经为我们提供了一系列命令来帮我们快速地生 成这一
系列基础文件。
#在命令行执行以下指令,会在当前目录生成一个mysite的文件夹,该文件夹中包含Django框架的一系列基础文件 django-admin startproject mysite
创建功能模块:
cd mysite #切换到mysite目录下,执行以下命令 python mannage.py startapp app01 #创建功能模块app01,此处的startapp代表创建application下的一个功能模块
运行:
python manage.py runserver 127.0.0.1:8080 #在浏览器输入:http://127.0.0.1:8080会看到Django的欢迎页面。
文件介绍:
- manage.py --- Django项目里面的工具,通过它可以调用django shell和数据库等
- settings.py --- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
- urls.py --- 负责把url模式映射到应用程序
生成同步数据库的脚本:python manage.py makemigrations
同步数据库:python manage.py migrate
注意:开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个粗暴方法是将migrations目录下的脚本(除了__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
3.admin
访问http://127.0.0.1:8000/admin/login/?next=/admin/时,需要为进入这个项目后台创建超级管理员:python manage.py createsuperuser,设置好账户密码就可以登陆。
(1)在admin文件执行如下配置
from django.contrib import admin from app01 import models # Register your models here. admin.site.register(models.Book,BookAdmin) #把某个表注册到admin的外部管理界面里 admin.site.register(models.Author) admin.site.register(models.Publish)
(2)为数据表添加功能
from django.contrib import admin from app01 import models # Register your models here. class BookAdmin(admin.ModelAdmin): list_display = ('id','name','price','pub_date') #在Home>app01>Book 显示字段 list_editable = ('name','price') #设置Home>app01>Book 可以编辑字段 filter_horizontal = ("authors",) #在Home>app01>Book>Add book下使字段变成可以搜索 list_per_page = 4 #设置Home>app01>Book 几条记录为一页 search_fields = ('id','name','publish__name') #在Home>app01>Book添加搜索字段 list_filter = ('pub_date','publish') #在Home>app01>Book添加过滤条件 ordering = ('price',) #设置Home>app01>Book进行排序 admin.site.register(models.Book,BookAdmin) #把某个表注册到admin的外部管理界面里 admin.site.register(models.Author) admin.site.register(models.Publish)
admin字段参数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
verbose_name Admin中显示的字段名称 blank Admin中是否允许用户输入为空 editable Admin中是否可以编辑 help_text Admin中该字段的提示信息 choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1) error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息; 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 如:{'null': "不能为空.", 'invalid': '格式错误'} validators 自定义错误验证(列表类型),从而定制想要的验证规则 from django.core.validators import RegexValidator from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\ MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator 如: test = models.CharField( max_length=32, error_messages={ 'c1': '优先错信息1', 'c2': '优先错信息2', 'c3': '优先错信息3', }, validators=[ RegexValidator(regex='root_\d+', message='错误了', code='c1'), RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'), EmailValidator(message='又错误了', code='c3'), ]
清空数据库:python manage.py flush
查询某个命令的详细信息:django-admin.py help startapp
启动交互界面:python manage.py shell(和直接运行python进入shell的区别是:你可以在这个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便)
终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>创建个人信息</h1> 9 10 <form action="/userInfor/" method="post"> 11 12 <p>姓名<input type="text" name="username"></p> 13 <p>性别<input type="text" name="sex"></p> 14 <p>邮箱<input type="text" name="email"></p> 15 <p><input type="submit" value="submit"></p> 16 17 </form> 18 19 <hr> 20 21 <h1>信息展示</h1> 22 23 <table border="1"> 24 25 <tr> 26 <td>姓名</td> 27 <td>性别</td> 28 <td>邮箱</td> 29 </tr> 30 {% for i in info_list %} 31 32 <tr> 33 <td>{{ i.username }}</td> 34 <td>{{ i.sex }}</td> 35 <td>{{ i.email }}</td> 36 </tr> 37 38 {% endfor %} 39 40 </table> 41 42 </body> 43 </html> 44 45 46 -----------------------url.py--------------------------------------- 47 url(r'^userInfor/', views.userInfor) 48 49 -----------------------views.py-------------------------------------- 50 51 info_list=[] 52 53 def userInfor(req): 54 55 if req.method=="POST": 56 username=req.POST.get("username",None) 57 sex=req.POST.get("sex",None) 58 email=req.POST.get("email",None) 59 60 info={"username":username,"sex":sex,"email":email} 61 info_list.append(info) 62 63 return render(req,"userInfor.html",{"info_list":info_list})
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>创建个人信息</h1> 9 10 <form action="/userInfor/" method="post"> 11 12 <p>姓名<input type="text" name="username"></p> 13 <p>性别<input type="text" name="sex"></p> 14 <p>邮箱<input type="text" name="email"></p> 15 <p><input type="submit" value="submit"></p> 16 17 </form> 18 19 <hr> 20 21 <h1>信息展示</h1> 22 23 <table border="1"> 24 25 <tr> 26 <td>姓名</td> 27 <td>性别</td> 28 <td>邮箱</td> 29 </tr> 30 {% for i in info_list %} 31 32 <tr> 33 <td>{{ i.username }}</td> 34 <td>{{ i.sex }}</td> 35 <td>{{ i.email }}</td> 36 </tr> 37 38 {% endfor %} 39 40 </table> 41 42 </body> 43 </html> 44 45 46 ----------------------------------------------models.py 47 from django.db import models 48 49 # Create your models here. 50 51 52 class UserInfor(models.Model): 53 54 username=models.CharField(max_length=64) 55 sex=models.CharField(max_length=64) 56 email=models.CharField(max_length=64) 57 58 ----------------------------------------------views.py 59 60 from django.shortcuts import render 61 62 from app01 import models 63 # Create your views here. 64 65 66 def userInfor(req): 67 68 if req.method=="POST": 69 u=req.POST.get("username",None) 70 s=req.POST.get("sex",None) 71 e=req.POST.get("email",None) 72 73 74 #---------表中插入数据方式一 75 # info={"username":u,"sex":e,"email":e} 76 # models.UserInfor.objects.create(**info) 77 78 #---------表中插入数据方式二 79 models.UserInfor.objects.create( 80 username=u, 81 sex=s, 82 email=e 83 ) 84 85 info_list=models.UserInfor.objects.all() 86 87 return render(req,"userInfor.html",{"info_list":info_list}) 88 89 return render(req,"userInfor.html")
4.基于Pycharm创建Django项目
实现一个简单示例:
(1)url.py
from django.contrib import admin from django. conf.urls import url #导入views模块 from app01 import views urlpatterna = [ url (r'^admin/',admin.site.urls), # r'^index/'会正则匹配ur1地址的路径部分 url (r'^show_time/',views.show_time),#新增地址http://127.0.0.1:8001/index/ 与index函数的映射关系
(2)视图views.py
from django.shortcuts import render #必须定义一个request形参,requeat相当于我们自定义框架时的environ参数 import datetime def show_time(request) : now=datetime .datetime.now() ctime=now. strftime("%Y-%m-%d %X") return render (request, "index.html",{"ctime":ctime}) # render会读取templates目录下的index.html文件的内容并且用字典中的ctime的值替换模版中的{{ ctime }}
(3)模板
在templates目录下新建文件show_time.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>当前时间:{{ctime}}</h1> </body> </html>
测试:
python manage.py runserver 8001 #在浏览器输入:http://127.0.0.1:8001/show_time/ 会看到当前时间