一、创建新的app(student)
1、全局路由规则和app路由规则建立联系
由于上次没有配置全局的路由规则或者没有让项目路由和app路由建立联系,也可以直接写在全局的路由规则里面,但是一旦多,将会造成混乱,不好调用。所以最好还是在每个app建立一个盛放路由规则的容器,即urls.py文件。
"""student_app URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
]
全局路由设置(myschool/urls.py)
"""myschool URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
'''导入模块url,和include,这里include作用是标记命名空间,可以在不同的app里面命名相同的文件名'''
from django.conf.urls import url,include
from django.contrib import admin
#导入两个app模块
import student
import grade
urlpatterns = [
url(r'^admin/', admin.site.urls),
'''url()里面前面是正则表达式,用来匹配请求或者说url路径,后面的include里面前面是跳转的页面或者说文件(注意路径要加上引号),namespace是命名空间,避免由于不同app里面的文件名相同,产生混乱。'''
url(r'^grade/',include('grade.urls',namespace='grade')),
url(r'^student/',include('student.urls',namespace='student')),
]
2、在项目配置文件增加已安装好的app的配置
修改增加myschool/settings.py
# Application definition
'''只要增加应用必须在这里面增加配置,便于该项目能够很快的查到该应用文件,否则会报错'''
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'grade.apps.GradeConfig',
'student.apps.StudentConfig',
]
3、创建student实体类和数据库
3.1创建实体类
student/models.py
from django.db import models
# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
class Meta:
# 给整个app设置别名
verbose_name='学生'
# 给该app里面的组成元素设置别名
verbose_name_plural='学生'
# 给实体类设置属性,或者说设置数据库里面表的字段属性
name=models.CharField('学生姓名',max_length=50,null=False)
sex=models.CharField('性别',max_length=2)
born=models.DateField('出生日期')
city=models.CharField('城市',max_length=100)
likes=models.CharField('爱好',max_length=100)
3.2建立数据库
前面的配置就不详细介绍了,具体配置请参考
http://blog.youkuaiyun.com/qq_38776653/article/details/74853040
调出mange.py项目控制界面,快捷键“Ctrl+Alt+r”
manage.py@myschool > **makemigrations student**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py makemigrations student D:/项目/myschool
Migrations for 'student':
student\migrations\0001_initial.py
- Create model Student
Following files were affected
D:\项目\myschool\student\migrations\0001_initial.py
Process finished with exit code 0
manage.py@myschool > **sqlmigrate student 0001**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py sqlmigrate student 0001 D:/项目/myschool
BEGIN;
--
-- Create model Student
--
CREATE TABLE `student_student` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(50) NOT NULL, `sex` varchar(2) NOT NULL, `born` date NOT NULL, `city` varchar(100) NOT NULL, `likes` varchar(100) NOT NULL);
COMMIT;
Following files were affected
Process finished with exit code 0
manage.py@myschool > **migrate student**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py migrate student D:/项目/myschool
Operations to perform:
Apply all migrations: student
Running migrations:
Applying student.0001_initial... OK
Following files were affected
Process finished with exit code 0
这里就不详细介绍每个命令的用处
4、把该项目连接到管理app
4.1修改student/admin.py
from django.contrib import admin
from . import models
# Register your models here.
class Admin_student(admin.ModelAdmin):
list_display=['name','sex','born','city','likes']
admin.site.register(models.Student,Admin_student)
4.2启动服务器,
登陆时,有时会出现这种情况,可能的原因就是重复登陆,或者有点卡,再重新登陆就基本没事,也有可能是路由规则不对,检查一下,还有可能是网页的url输入不正确。
从这个可以看到app,student已经添加成功。
添加数据后的页面如下:
添加记录后的数据库情况如下:
4.3创建表的外键,并修改数据库的方式
在上述的操作过程中,没有设置外键,现在就要添加外键,并更新数据库。
修改student/models.py文件,内容如下:
from django.db import models
#一定要注意导包的格式
from grade.models import Grade
# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
class Meta:
# 给整个app设置别名
verbose_name='学生'
# 给该app里面的组成元素设置别名
verbose_name_plural='学生'
# 给实体类设置属性,或者说设置数据库里面表的字段属性
name=models.CharField('学生姓名',max_length=50,null=False)
sex=models.CharField('性别',max_length=2)
born=models.DateField('出生日期')
city=models.CharField('城市',max_length=100)
likes=models.CharField('爱好',max_length=100)
# 设置外键注意要导模块,verbose_name是外键设置的别名
grade=models.ForeignKey(Grade,null=True,verbose_name='班级')
然后用manage.py@myschool(Ctrl+Alt+r)界面对文件进行二次处理,
处理方式如下:
manage.py@myschool > makemigrations student
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py makemigrations student D:/项目/myschool
Migrations for 'grade':
grade\migrations\0002_auto_20170713_1352.py
- Change Meta options on grade
Migrations for 'student':
student\migrations\0002_student_grade.py
- Add field grade to student
Following files were affected
D:\项目\myschool\grade\migrations\0002_auto_20170713_1352.py
D:\项目\myschool\student\migrations\0002_student_grade.py
Process finished with exit code 0
同时会产生一个文件
扩展:如果将数据库里面的表格进行删除之后,要重新创建表,是否能按照以前的创建方法。
答案是:不能直接创建。因为在创建和修改过程中,会生成一些日志信息,存在数据库里面,必须将日志删除后才会成功。
日志信息会存储到下表里面。
扩展:如果将数据库里面的表格进行删除之后,要重新创建表,是否能按照以前的创建方法。
答案是:不能直接创建。因为在创建和修改过程中,会生成一些日志信息,存在数据库里面,必须将日志删除后才会成功。
日志信息会存储到下表里面。
所以除了删除表之外,还应该删除在表Django_migrations里的记录,有时也要删除该app项目目录下的migrations目录下的文件。
二、用Django框架做web编程
1、添加数据(以student实体类为例)
先将实体类绑定成表单,本博主修改的是student/views.py
# 导入转发模块
from django.shortcuts import render
#导入重定向模块
from django.shortcuts import redirect
#导入表达表单模块
from django import forms
#导入实体类
from . import models
# 导入插件或者小部件模块
from django.contrib.admin import widgets
# Create your views here.
# 把实体类绑定表单
class student_form(forms.ModelForm):
# 绑定日期类型的字段,注意:DateField,AdminDateWidget一定要一致,生成日期类型表单
born = forms.DateField(widget=widgets.AdminDateWidget(),label='生日')
#绑定邮箱框
email=forms.EmailField(widget=forms.EmailInput(),label='邮箱')
#绑定密码框
pwd = forms.CharField(widget=forms.PasswordInput(),label='密码')
#绑定单选框
sex=forms.CharField(widget=forms.RadioSelect(choices=[('男','男'),('女','女')]),label='性别')
#绑定下拉列表
city=forms.CharField(widget=forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),label='城市')
# 绑定复选框
likes=forms.CharField(widget=forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')]),label='爱好')
# 创建内部类Meta来绑定字符等字段,生成输入框,单选框,复选框,等表单
class Meta:
# 建立实体类模型
model=models.Student
# 将实体类或者数据库中的属性或字段提取出来,形成数组,这也代表页面显示的表单名
fields='__all__'
# 注意写下面的方式会爆出异常
# django.core.exceptions.ImproperlyConfigured: Creating a ModelForm
# without either the 'fields' attribute or the 'exclude' attribute is prohibited; form student_forms needs updating.
# 改成上面的方式将不会报错
# fileds=['name','grade',' sex','born','city','likes']
# 下面这种方式创建不稳定,如果说外部类的格式声明过多时就不会显示这些格式
# 小编在外面声明三个就不显示下面的格式
# widget={#单选框
# 'sex': forms.RadioSelect(choices=[('男','男'),('女','女')]),
# # 复选框
# 'city': forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),
# # 下拉列表
# 'likes': forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')])
# }
def addRender(request):
# 生成表单实例
sf=student_form
#将请求转发到../web/add.html,并携带参数{'form':sf}
return render(request,'../web/add.html',{'form':sf})
修改student/urls.py文件
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 根据请求(url)和正则表达式跳转到views.py里面的方法,相当于java中的过滤器或者中转站
# 这里的name是将该路径取一个别名,便于访问
url(r'^add$',views.addRender,name='add'),
]
创建html网页,在项目下web目录下
创建add.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--这是形成日期的格式-->
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" />
<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.js"></script>
<script type="text/javascript" src="/static/admin/js/urlify.js"></script>
<script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
<script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.js"></script>
<script type="text/javascript" src="/static/admin/js/calendar.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
</head>
<body>
{#{% url 'student:save' %}#}
<form action="" method="post">
<!--这是表单必须有的,这是一种安全模式(跨站点请求伪造),否则会报错-->
{% csrf_token %}
{# 这是将传过来的绑定好的表单按照段落进行遍历#}
{{ form.as_p }}
<input type="submit" value="提交">
</form>
</body>
</html>
开启服务器输入下面网址:
http://localhost:8000/student/add
二、实现学生用户的增删改查
具体的编写过程就不详细说了,下面是编写的代码:
整个项目的名称是:myschool
整个项目有两个app分别是:grade和student
对于整个项目的setting.py(myschool/settings.py)的设置如下(这里就不解释每个设置的作用):
"""
Django settings for myschool project.
Generated by 'django-admin startproject' using Django 1.11.3.
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '0*_a@(rp^%)p%!q01s)$+khj7hp*(o_&1j&1zy6h*0n0(d12fo'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'grade.apps.GadeConfig',
'student.apps.StudentConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'myschool.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR+"/web",],
'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',
],
},
},
]
WSGI_APPLICATION = 'myschool.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'myschool',
'USER':'root',
'PASSWORD':'mysql',
'HOST':'localhost',
'PORT':'3306',
}
}
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScr
ipt, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
myschool/urls.py
from django.conf.urls import url,include
from django.contrib import admin
import student
import grade
urlpatterns = [
url(r'^admin/', admin.site.urls),
#后面的namespace指的是命名空间,避免在不同app下的由于文件重名而产生的错误
url(r'^student/',include('student.urls',namespace='student')),
url(r'^grade/',include('grade.urls',namespace='grade')),
]
grade/models.py
# 创建一个班级类,继承models.Model的类
class Grade(models.Model):
class Meta:
# app别名的单数
verbose_name='年级'
# app别名的复数
verbose_name_plural='年级'
# 班级名称,类型是字符字段,别名是‘班级名称’,最大长度是50(这是字符字段必须写的),
# 不能为空,唯一
name=models.CharField('班级名称',max_length=50,null=False,unique=True)
# 开班日期,类型日期字段,别名‘开班日期’,这个作用之后会显现
createDate=models.DateField('开班日期')
students/models.py
# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
class Meta:
# 给整个app设置别名
verbose_name='学生'
# 给该app里面的组成元素设置别名
verbose_name_plural='学生'
# 给实体类设置属性,或者说设置数据库里面表的字段属性
name=models.CharField('学生姓名',max_length=50,null=False)
sex=models.CharField('性别',max_length=2)
born=models.DateField('出生日期')
city=models.CharField('城市',max_length=100)
likes=models.CharField('爱好',max_length=100)
email=models.CharField('邮箱',max_length=50)
pwd=models.CharField('密码',max_length=20)
# 设置外键注意要导模块,verbose_name是外键设置的别名
grade=models.ForeignKey(Grade,null=True,verbose_name='班级')
student/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 根据请求(url)和正则表达式跳转到views.py里面的方法,相当于java中的过滤器或者中转站
# 这里的name是将该路径取一个别名,便于访问
# url(r'^add/(?P<id>[0-9]+)/$',views.add,name='add'),
# 传递的url里面含有参数
url(r'^add/(?P<id>[0-9]+)/$',views.add,name='add'),
url(r'^save/(?P<id>[0-9]+)/$',views.save,name='save'),
url(r'^delete/(?P<id>[0-9]+)/$',views.delete,name='delete'),
url(r'^list$',views.list,name='list'),
]
student/views.py
# 导入转发模块
from django.shortcuts import render
#导入重定向模块
from django.shortcuts import redirect
#导入表达表单模块
from django import forms
#导入实体类
from . import models
# 导入插件或者小部件模块
from django.contrib.admin import widgets
# Create your views here.
# 把实体类绑定表单
class student_form(forms.ModelForm):
# 绑定日期类型的字段,注意:DateField,AdminDateWidget一定要一致,生成日期类型表单
born = forms.DateField(widget=widgets.AdminDateWidget(),label='生日')
#绑定邮箱框
email=forms.EmailField(widget=forms.EmailInput(),label='邮箱')
#绑定密码框
pwd = forms.CharField(widget=forms.PasswordInput(),label='密码')
#绑定单选框
sex=forms.CharField(widget=forms.RadioSelect(choices=[('男','男'),('女','女')]),label='性别')
#绑定下拉列表
city=forms.CharField(widget=forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),label='城市')
# 绑定复选框
likes=forms.CharField(widget=forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')]),label='爱好')
# 创建内部类Meta来绑定字符等字段,生成输入框,单选框,复选框,等表单
class Meta:
# 建立实体类模型
model=models.Student
# 将实体类或者数据库中的属性或字段提取出来,形成数组,这也代表页面显示的表单名
fields='__all__'
# 注意写下面的方式会爆出异常
# django.core.exceptions.ImproperlyConfigured: Creating a ModelForm
# without either the 'fields' attribute or the 'exclude' attribute is prohibited; form student_forms needs updating.
# 改成上面的方式将不会报错
# fileds=['name','grade',' sex','born','city','likes']
# 下面这种方式创建不稳定,如果说外部类的格式声明过多时就不会显示这些格式
# 小编在外面声明三个就不显示下面的格式
# widget={#单选框
# 'sex': forms.RadioSelect(choices=[('男','男'),('女','女')]),
# # 复选框
# 'city': forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),
# # 下拉列表
# 'likes': forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')])
# }
# 这个方法是对数据库进行增加和修改,这相当于java中的Servlet层
def add(request,id):
# 表明是增加操作
if id=='0':
# 生成表单实例
sf=student_form
id='0'
# 表名是修改操作
else:
# 查到数据,封装成实体类对象
student=models.Student.objects.get(id=id)
# 对数据对象进行绑定表单
sf=student_form(instance=student)
return render(request,'../web/add.html',{'form':sf,'id':id})
# 将网页中的请求内容保存到数据库中,或者将修改数据
def save(request,id):
# 判断是否是修改还是增加的数据记录
if id == "0":
# 创建新的实体类对象
student=models.Student()
else:
student=models.Student.objects.get(id=id)
# 绑定
form=student_form(request.POST,instance=student)
# 判断是否绑定合法
if form.is_valid() :
# 合法保存数据
# 等价于form.save(commit)
# 重定向redirect是把请求发送到别的操作方法里面,地址是相对于整个项目来说(符合url.py里面的路由规则)
# 所以只会从项目下的urls.py里面查找路由规则
# 转发render是将请求和结果转发到别的网页页面,所以地址是相对
form.save()
else:
# 如果不合法转发到原页面
return render(request,'add.html',{'form':form,"id":id})
#如果保存完成, 重定向到/student/list,不能带参数过去
return redirect('/student/list')
# # 该方法是将数据库里面的记录查找出来,按照条件查询
def list(request):
# 如果请求是POST说明带的有参数则根据参数查找
if request.method=='POST':
# 根据名字查找记录
students=models.Student.objects.filter(name__contains=request.POST['likename'])
else:
# 查找所有的记录
students=models.Student.objects.all()
return render(request,'list.html',{'students':students})
# 该方法是对记录进行删除
def delete(request,id):
# 查找记录
student=models.Student.objects.get(id=id)
# 删除记录
student.delete()
# 返回首页
return redirect('/student/list')
web/add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--这是形成日期的格式-->
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" />
<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.js"></script>
<script type="text/javascript" src="/static/admin/js/urlify.js"></script>
<script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
<script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.js"></script>
<script type="text/javascript" src="/static/admin/js/calendar.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
</head>
<body>
{#{% url 'student:save' %}#}
{#{% result %}#}
<form action="{% url 'student:save' '0' %}" method="post">
<!--这是表单必须有的,这是一种安全模式(跨站点请求伪造),否则会报错-->
{% csrf_token %}
{# 这是将传过来的绑定好的表单按照段落进行遍历#}
{{ form.as_p }}
<input type="submit" value="提交">
</form>
</body>
</html>
web/list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="{% url 'student:add' '0' %}">添加</a><br/>
<form action="{% url 'student:list' %}" method="post">
{% csrf_token %}
{# value={{ request.POST.likename }}#}
姓名:<input type="text" name='likename' value={{ request.POST.likename }}/>
<input type="submit" value="查询"/>
</form>
<table border="2px">
<tr>
<th>学生姓名</th>
<th>性别</th>
<th>出生日期</th>
<th>城市</th>
<th>爱好</th>
<th>邮箱</th>
<th>密码</th>
<th>操作</th>
</tr>
{% for student in students %}
<tr>
<td>{{ student.name }} </td>
<td>{{ student.sex }}</td>
<td>{{student.born }} </td>
<td>{{ student.city }}</td>
<td>{{ student.likes }}</td>
<td>{{ student.email }} </td>
<td>{{ student.pwd }}</td>
<td>
<a href="{% url 'student:add' student.id%}">修改</a>
<a href="{% url 'student:delete' student.id %}">删除</a>
</td>
</tr>
{% endfor %}
</table>
</form>
</body>
</html>
具体的实现结果这里就不详细介绍了。
三、整个项目的执行过程流程图如下: