步骤如下:
-
下载django模块
pip install Django
-
在文件的命令提示符上创建django项目
django-admin startproject 项目名称
-
运行django项目–在编辑器的终端输入以下命令
python manager.py runserver
一个项目所有的业务和页面展示通过app完成。在编辑器的终端输入以下命令
python manager.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')或页面渲染为{ url 别名}}">别名访问。不管你的路径如何修改,别名都可以访问
-
把子路由注册到项目的路由下面
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/根路由/子路由名称
在当前项目的目录下,创建一个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")
前面已经知道了通过render,可以把页面交给浏览器展示,同时可以设置数据,想要数据在页面显示必须满足模板语法的要求.假设数据如:
-
数据如下:
class Test(View): def get(self,request): data={ 'title':'render模板语法的使用', 'love':['爬山','踢足球','打篮球'], 'error':'' } return render(request,'test.html',data) -
直接显示
{ key名称 }}直接显示render数据键对应的值 -->{{title}}
-
条件判断
{%if error%}错误信息:{{error}}
{%endif %} -
循环
-
{%for item in love%}
- {{item}} {%endfor%}
-
继承:{% extends 'base.html' %}这个是一个特殊的语法,如:我的main.html中已经有了一个导航栏功能,其它页面也想要显示,则可以通过继承的方式。通常和{% block 名称%}{% endblock %}配合使用,block是在main页面留一个空白,其他页面继承了,想要自定义其它功能,可以重写此block.
main.html页面
{% load static %}{% block title %}{% endblock %} {% block css %}{% endblock %} {% block content %}{% endblock %} {% block js %}{% endblock %}other.html
{% extends 'base.html' %} {% block content %} 我是other页面 {% endblock %}
在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:多对多
前面的模型外键关联了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 manager.py createsuperuser2.5 迁移模型表到到数据库
模型已经创建好了,如果想要在数据库中生成对应的表,则在项目下的终端输入以下命令:
python manage.py makemigrations python manage.py migrate
三、表单内容 3.1提交方式注意:如果修改了表模型的字段,则必须重新输入以上命令。否则出现field cannot find
提交方式有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值')
class Login(View): def get(self,request): username=request.POST.get('username') password=request.POST.get('password') return HttpResponse("get提交...")post数据提交必须设置{% csrf_token %}
使用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目录



