github网址: https://github.com/Nereus-Minos/EChatNow
展示网址: http://zhaohang.pythonanywhere.com/
一. Django的MTV模式简介
- M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
- T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
- V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
二. Django的MTV使用流程
1首先,配置URL
在 " 项目名称/urls.py" 文件中修改:
urlpatterns = [
path('', include('mvc.urls')),
]
意思是:当服务器接收到任何的网址请求都要转接到应用mvc目录下的urls.py中.
建立"mvc/urls.py"文件并添加代码:
from django.conf.urls import url
from mvc import views
urlpatterns = [
url(r'^$', views.index), # 主页
]
意思是:当服务器接收到请求的网址后缀为空,则执行同目录下的views.py文件中的index函数.
建立"mvc/views.py"文件并添加代码: -----(V)
from django.http import HttpResponse
def index(request):
_template = loader.get_template('index.html')
_context = {}
_output = _template.render(_context)
return HttpResponse(_output)
意思是:返回一个叫’index.html’的HTML模板,这个模板存在于"templates/index.html"
建立"templates/index.html"并添加代码: -----(T)
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
hello!
</body>
<.html>
三. 此时再运行:
python manage.py runserver
可以见到我们写的hello!
四. 模型的使用
它主要负责与数据的交互,在使用django框架设计应用系统时,需要注意的是django默认采用的是orm框架中的codefirst模型,也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来
django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与数据库同步版本的变化,所以在使用django进行开发时不要手工去修改数据库,这样会造成django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容
1:数据库连接配置:settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '434944800',
'HOST': 'localhost',
'PORT': '3306',
}
}
2. 编写Model
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class userInfo(models.Model):
username=models.CharField(max_length=100)
passwd=models.CharField(max_length=20)
sex=models.BooleanField()
类userinfo即相当于数据表名,django实际生成的表名为web_userinfo,由于对数据库的操作需要借助于django,所以model类需要继承自models.Model
3. 与数据库进行同步
准备工作完成后在终端进行工程所在目录中输入命令:
python manage.py makemigrations
生成镜像文件
python manage.py migrate
同步到数据库
执行以上两条命令将对Model和数据库进行同步
4. 使用
在"mvc/views.py"中导入模型:
from mvc.models import userInfo
使用django模板的相关语法进行数据的提取:
_user = userInfo.objects.get(username= ''aaa')
上面的意思是:获得姓名为aaa用户对象
5.使用的相关知识
Person.objects.create(name=name,age=age) # 新建一个对象
p = Person(name="WZ", age=23)
p.save() # 将信息保存到数据库
p = Person(name="TWZ") # 新建一个对象
p.age = 23
p.save() # 将信息保存到数据库
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
获取对象有以下方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.get(name=name)
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的