目录
MVC
用一种业务逻辑、数据、界面显示分离的方法组织代码
核心:解耦,实现每个模块的单独存放,易于维护
部分 | 作用 |
---|---|
model | 用于处理应用程序数据逻辑的部分,通过模型对象与数据库相连 |
view | 处理数据显示问题,依据model创建 |
controller | 用户交互的部分,从model读取数据,控制用户输入并发给view进行显示 |
MTV
与MVC无本质差别,依旧保持松耦合
部分 | 作用 |
---|---|
model | 负责业务对象与数据库对象(对应model) |
template | 负责如何展示页面给用户(对应view) |
view | 负责业务逻辑,并适当调用model,template(对应controller) |
*url分发器 | 将不同的url交付给对应的view处理 |
Django相关操作
创建项目
进入目标目录
(learn_environment) F:\learn_django>django-admin startproject project
目录层级说明
F:\LEARN_DJANGO
└─project
│ manage.py
│
└─project
settings.py
urls.py
wsgi.py
__init__.py
manage.py 命令行工具,可以进行多种交互
project
__init__.py 空文件,作为python包
settings.py 项目配置文件
urls.py url控制器声明
wsgi.py 项目与wsgi兼容的web入口
基本操作
配置数据库
在settings.py文件中的DATABASE选项配置
#settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}
}
在__init__.py文件中写入(需要安装pymysql)
#__init__.py
import pymysql
pymysql.install_as_MySQLdb()
创建应用
在一个项目中,可以创建多个应用,每个应用进行一种业务逻辑操作
(learn_environment) F:\learn_django\project>python manage.py startapp myapp
目录说明
文件名 | 作用 |
---|---|
admin.py | 站点配置 |
models.py | 模型 |
views.py | 视图 |
激活应用
在settings.py文件中,将myapp加入INSTALLED_APPS中
# settings.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
数据库交互
定义models.py,与数据库交互,数据库中每一张数据表对应models中一个模型类
# 导入models包,用于models.Model继承
from django.db import models
# Create your models here.
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
迁移建表
生成迁移文件
(learn_environment) F:\learn_django\project>python manage.py makemigrations
Migrations for 'myapp':
myapp\migrations\0001_initial.py
- Create model Students
执行迁移(在数据库中生成表)
(learn_environment) F:\learn_django\project>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying myapp.0001_initial... OK
Applying sessions.0001_initial... OK
测试数据库交互操作
>>> from myapp.models import Grades,Students
>>> from django.utils import timezone
>>> from datatime import *
查询:
>>> Grades.objects.all()
<QuerySet [<Grades: uestc01-3-24>]>
>>> grade1.students_set.all()
<QuerySet [<Students: Students object>, <Students: Students object>]>
添加:创建模型类的对象实力,初始化属性后,调用save()
>>> grade1 = Grades()
>>> grade1.gname = 'uestc01'
>>> grade1.gdata = datetime(year = 2020, month = 5, day=11)
>>> grade1.ggirlnum = 3
>>> grade1.gboynum = 24
>>> grade1.save()
查找:
>>> grade1 = Grades.objects.get(pk=1)
>>> grade1
<Grades: uestc01-3-24>
修改:将对象修改后,调用save()
删除:调用delete(),物理删除,直接删除数据表中记录
外键关联:给对象的外键属性赋值外键对象
启动服务器
此处调用的服务器是以python写的轻量级web服务器,仅适合用于开发和测试
(learn_environment) F:\learn_django\project>python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
May 11, 2020 - 16:07:06
Django version 1.11.4, using settings 'project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Admin站点管理
配置
需要在settings.py文件中的INSTALLED_APPS中添加,一般创建项目时会自动添加。
INSTALLED_APPS = [
'django.contrib.admin', # admin配置
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
汉化
需要在settings.py文件中配置
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
管理数据表
需要在myapp/admin.py文件中注册
from django.contrib import admin
from .models import Grades, Students
admin.site.register(Grades)
admin.site.register(Students)
自定义界面
# myapp/admin.py
class GradeAdmin(admin.ModelAdmin):
# 列表页属性
# 显示字段
list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
# 过滤字段
list_filter = ['gname']
# 查找字段
search_fields = ['gname']
# 分页
list_per_page = 5
# 添加、修改页属性
# 规定属性的先后顺序
# fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
# 给属性分组
fieldsets = [
('num', {'fields': ['ggirlnum', 'gboynum']}),
('base', {'fields': ['gname', 'gdate', 'isDelete']})
]
# 以上两个属性不能同时使用
关联对象自动创建(Inline方法)
class StudentsAutoCreate(admin.TabularInline):
model = Students
extra = 1
class GradeAdmin(admin.ModelAdmin):
inlines = [StudentsAutoCreate]
使用装饰器
# @admin.register(Student)
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return 'male'
else:
return 'female'
# 设置页面列名
gender.short_description = '性别'
list_display = ['pk', 'sname', gender, 'sage', 'scontend', 'sgrade', 'isDelete']
list_per_page = 5
# 执行动作的位置
actions_on_bottom = True
actions_on_top = False
admin.site.register(Students, StudentsAdmin)
视图的基本使用
是python函数,在views.py文件中定义
定义视图
def grades(request):
# 去模板里取数据
grades_list = Grades.objects.all()
# 将数据传给模板
return render(request, 'myapp/grades.html', {"grades": grades_list})
def students(request):
student_list = Students.stuObj2.all()
return render(request, 'myapp/students.html', {'students': student_list})
配置url
①修改project/urls.py
from myapp import urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myapp.urls'))
]
②在app/urls.py创建
urlpatterns = [
# 匹配无字符
url(r'^$', views.index),
# 匹配数字
url(r'^(\d+)/$', views.detail), # 正则表达式
url(r'^grades/$', views.grades),
url(r'^students/$', views.students),
]
附:模板(html文件)的基本使用
是html的页面,并且可以根据视图中传递的数据进行填充
①创建项目模板目录
F:\PYTHONFILES\LEARN_DJANGO\PROJECT\TEMPLATES
└─myapp
grades.html
students.html
②配置路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]
③定义模板
1、{{ 值、变量、对象属性 }}
2、{% python执行代码块 %}
④写模板
# grades.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息列表</h1>
<u1>
{% for grade in grades %}
<li>
<a href="{{ grade.id }}">{{ grade.gname }}</a>
</li>
{% endfor %}
</u1>
</body>
</html>
# students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生信息列表</h1>
<u1>
{% for student in students %}
<li>
<a href="#">{{ student.sname }}----{{ student.scontend }}----{{ student.sage }}</a>
</li>
{% endfor %}
</u1>
</body>
</html>
⑤定义视图
def grades(request):
# 去模板里取数据
grades_list = Grades.objects.all()
# 将数据传给模板
return render(request, 'myapp/grades.html', {"grades": grades_list})
def students(request):
student_list = Students.stuObj2.all()
return render(request, 'myapp/students.html', {'students': student_list})
⑥配置urls.py
url(r'^grades/$', views.grades),
url(r'^students/$', views.students),