django复习
一、Django项目的创建和常用功能
1.1 创建django项目
步骤如下:
-
下载django模块
pip install Django
-
在文件的命令提示符上创建django项目
django-admin startproject 项目名称
-
运行django项目–在编辑器的终端输入以下命令
python manage.py runserver
1.2 创建项目的APP
一个项目所有的业务和页面展示通过app完成。在编辑器的终端输入以下命令
python manage.py startapp 应用程序的名称
项目中注册app,打开项目下的setting.py
文件,把app名称加入进去
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'stuMangerApp' # 创建的App名称
]
1.3 配置路由功能
配置网页的访问路径,一个具体的访问路径对应一个具体业务的处理功能类。
步骤如下:
-
在app目录下创建一个类,并且继承View类型,然后在get/post方法里面写具体的业务
class Menu(View): def get(self,request): return HttpResponse("i am menu page")
-
在当前的app目录下创建一个子路由模块,并设置
urlpatterns=[]
属性from django.urls import path # 导入path模块 urlpatterns=[ path('menu',Menu.as_view()), path('login',Login.as_view()), # 管理员、老师、学生各自的路由 path('admin',AdminMenu.as_view()), path('student',StudentMenu.as_view(),name="stu"), path('teacher',TeacherMenu.as_view()) .... ]
-
配置url别名说明:
name="stu"
是当前url访问的别名,本来访问是127.0.0.1:8000/SM/student
,但是在重定向可以是redirect('stu')
或页面渲染为<a href="{{ url 别名}}">别名访问</a>
。不管你的路径如何修改,别名都可以访问 -
把子路由注册到项目的路由下面
from django.contrib import admin from django.urls import path,include #导入include模块 from stuMangerApp import stu_manager_urls urlpatterns = [ path('admin/', admin.site.urls), # 配置项目的父路由 path('SM/',include(stu_manager_urls)) # 注册子路由 ]
-
运行项目进行访问,访问路径为
http://127.0.0.1:8000/根路由/子路由名称
1.4 配置template目录
在当前项目的目录下,创建一个templates
文件夹,里面用于存放html页面,然后在setting.py
注册此目录
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#=============把创建的目录加入进去========================
'DIRS': ['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.5 配置静态目录
在项目下创建一个static
目录,和templates
目录平级,此目录用于存放静态资源,如js,img,css等等。然后在setting.py注册此目录
STATIC_URL = 'static/'
# 配置静态文件目录
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),) # 逗号不能丢
1.6页面响应
在一个视图类中的get/post方法中,通过return xxx
,把具体内容交给浏览器显示,常见的内容响应如下:
-
响应字符串
HttpResponse
from django.http import HttpResponse from django.views import View class Test(View): def get(self,request): return HttpResponse("hello world") //页面会直接显示helloworld
-
响应json
JsonResponse
from django.http import JsonResponse from django.views import View class Test(View): def get(self,request): data={ 'name':'张三', 'age':12 } # 必须传入一个字典类型数据 return JsonResponse(data) //页面会直接显示json数据
-
渲染模板 通过render把templates目录下对应的html交给页面进行显示,同时可以设置对应数据。
from django.shortcuts import render class Login(View): def get(self,request): data={ 'k1':value1, 'k2':value2, ..... } # data必须是一个字典,才能把数据传入给页面。 return render(request,'login.html'[,data]) # [,data]给页面传递数据,不写也行
-
重定向
from django.shortcuts import redirect class Test(View): def get(self,request): # redirect(名称) 可以是配置的路由path,也可以是别名 return redirect("/SM/menu")
1.7 模板语法
前面已经知道了通过render,可以把页面交给浏览器展示,同时可以设置数据,想要数据在页面显示必须满足模板语法的要求.假设数据如:
-
数据如下:
class Test(View): def get(self,request): data={ 'title':'render模板语法的使用', 'love':['爬山','踢足球','打篮球'], 'error':'' } return render(request,'test.html',data)
-
直接显示
<!-- {{ key名称 }}直接显示render数据键对应的值 --> <p>{{title}}</p>
-
条件判断
{%if error%} <!-- 如果信息存在则显示--> <p>错误信息:{{error}}</p> {%endif %}
-
循环
<ul> {%for item in love%} <li>{{item}}</li> <!--显示列表中的每一项--> {%endfor%} </ul>
-
继承:
{% extends 'base.html' %}
这个是一个特殊的语法,如:我的main.html中已经有了一个导航栏功能,其它页面也想要显示,则可以通过继承的方式。通常和{% block 名称%}{% endblock %}
配合使用,block是在main页面留一个空白,其他页面继承了,想要自定义其它功能,可以重写此block.main.html页面
<!DOCTYPE html> {% load static %} <html lang="zh"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"> <script src="/static/js/jquery-3.5.1.min.js"></script> <script src="/static/js/echarts.js"></script> <script src="/static/bootstrap/js/bootstrap.js"></script> <title>{% block title %}{% endblock %}</title> {% block css %}{% endblock %} </head> <body> <nav>.........我是导航栏.............</nav> {% block content %}{% endblock %} {% block js %}{% endblock %} </body> </html>
other.html
<!--==============直接继承main.html============ --> {% extends 'base.html' %} <!-- 我的页面已经包含main页面的全部功能了,如果想要在增加,则重写block块---> {% block content %} <h3> 我是other页面 </h3> {% endblock %}
二、创建表模型
2.1 创建模型
在app目录下的models.py
文件下,创建和表相关的模型类, 如:分别创建了老师、学生、分数模型,xxxField
表示表字段的数据类型
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
#==========Teacher=================
class Teacher(models.Model):
real_name=models.CharField(verbose_name="真实姓名",max_length=64,default="无")
subject=models.CharField(verbose_name="授课名称",max_length=64,default="无")
user=models.OneToOneField(to=User,on_delete=models.SET_NULL,blank=True,null=True)
#=========Student=================
class Student(models.Model):
real_name = models.CharField(verbose_name="真实姓名", max_length=64, default="无")
group = models.CharField(verbose_name="班级",max_length=10,default="无")
year = models.CharField(verbose_name="出生年份",max_length=16,default="无")
month = models.CharField(verbose_name="出生月份",max_length=16,default="无")
day = models.CharField(verbose_name="出生日期",max_length=16, default="无")
user = models.OneToOneField(to=User, on_delete=models.SET_NULL, blank=True, null=True)
#============Score==================
class Score(models.Model):
subject_name=models.CharField(max_length=16) # 教的学科名
score=models.IntegerField(default=0) # 分数
group=models.CharField(max_length=16) # 班级
# 设置对应学生表的外键
student=models.ForeignKey(Student,on_delete=models.SET_NULL,blank=True,null=True)
2.2 表和表的关系
-
OneToOneField
:一对一,如每个老师/学生都有一个账号,每个账号只能属于某个老师或学生。class Teacher(models.Model): ... user=models.OneToOneField(to=User,on_delete=models.SET_NULL,blank=True,null=True) class Student(models.Model): ... user = models.OneToOneField(to=User, on_delete=models.SET_NULL, blank=True, null=True)
on_delete表示如果删除了老师获取学生的账号,那么老师表或学生表关于账号信息的对应字段设置为
null
-
ForeignKey
:即设置表模型的外键,可实现一对多.如一个学生有多门课程的分数保存在Score表模型中class Score(models.Model): subject_name=models.CharField(max_length=16) # 教的学科名 ... # 设置对应学生表的外键 student=models.ForeignKey(Student,on_delete=models.SET_NULL,blank=True,null=True)
-
ManyToManyField
:多对多
2.3 系统默认模型User
前面的模型外键关联了User
类,这个类其实就是django自带的表模型,里面有username
和password
字段。导入默认模型如下:
from django.contrib.auth.models import User
此模型还带了许多关于数据验证的功能.
from django.contrib.auth import authenticate, login,logout
# 验证账号和密码是否正确 如果正确返回User对象否则为None,一般用于数据验证
user=authenticate(username=username,password=password)
# 用户登录成功,直接把数据存储到session里面,浏览器存储cookie
login(request,user)
#用户退出登录,直接清除session
logout(request)
2.4 创建超级用户
如果想要在这个表里面创建超级用户,表示管理员,则在项目下的终端输入以下命令:
python manage.py createsuperuser
2.5 迁移模型表到到数据库
模型已经创建好了,如果想要在数据库中生成对应的表,则在项目下的终端输入以下命令:
python manage.py makemigrations
python manage.py migrate
注意:如果修改了表模型的字段,则必须重新输入以上命令。否则出现
field cannot find
三、表单内容
3.1提交方式
提交方式有get和post,在视图类中不同的提交方式对应具体的方法.
'''登录视图'''
class Login(View):
def get(self,request):
....
return HttpResponse("get提交...")
def post(self,request):
...
return HttpResponse("post提交...")
3.2数据获取
-
get数据获取
request.GET.get('表单提交的name值')
class Login(View): def get(self,request): username=request.GET.get('username') password=request.GET.get('password') return HttpResponse("get提交...")
-
post数据获取 ,页面和视图类设置如下:
request.POST.get('表单提交的name值')
<form method="post" class="form"> {% csrf_token %} ... </form>
class Login(View): def get(self,request): username=request.POST.get('username') password=request.POST.get('password') return HttpResponse("get提交...")
post数据提交必须设置
{% csrf_token %}
3.2 错误信息获取
使用render渲染模板,在方法参数里面可以传递一个字典对象,页面使用{{error}}
,输出错误
from django.contrib.auth import authenticate, login,logout
from django.contrib.auth.models import User
'''登录视图'''
class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
#获取用户post提交过来的数据
username=request.POST.get("username")
password=request.POST.get("password")
data={'error':''}
#检查用户表里是否存在此用户名
if User.objects.filter(username=username):
# 判断用户和密码是否正确
user=authenticate(username=username,password=password)
# 判断是否超级用户
if user and user.is_superuser:
login(request,user)
# return HttpResponse("登录成功")
return redirect('/SM/admin')
else:
data['error'] = '不是超级管理员账号'
return render(request, 'login.html', data)
else:
data['error']='没有此用户'
return render(request, 'login.html',data)
四、MVT架构说明
-
M
: 模型层,完成与数据的交互 对应models.py.一个模型对应一个数据库中的表。表的关系也可以清晰体现 -
V
:视图层,一个视图类对应一个url请求对应views.py -
T
:完成HTMl文件的渲染对应templates目录