题目
- 模型类
- 班级:班级名、人数
- 学生:姓名、年龄、头像、所属班级
- 功能
- 班级添加
- 学生添加,外键需要下拉框实现
- 展示所有班级
- 点击班级,跳转到学生列表页面(路由跳转时,需要传递 班级id 作为参数)
- 展示该班级的所有学生
- 点击学生,跳转到学生详情页面(路由跳转时,需要传递 学生id 作为参数)
- 在每个学生后面显示一个 删除按钮, 点击按钮,删除当前学生
- 在每个学生前面显示一个 复选框, 点击批量删除, 删除所有选中的学生
步骤
django
准备工作
创建项目
django-admin startproject school
在项目中,创建APP,最后:项目包含app
cd school # 进入项目中
python manage.py startapp student # 创建app
如果项目无法运行,一般是解释器配置错误
- 点击 file—> settings, 打开配置菜单
- 在菜单中,点击 project:项目名,当前项目为school, 因此,点击
project:school
- 点击第一个选项:
python Interpreter
,选择对应的解释器即可
修改配置项
修改 settings.py 文件
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders', # 跨域
'rest_framework', # drf框架
'student' # 自己的APP
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', # 添加跨域中间件
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 关闭csrf验证中间件
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True # 允许所有源访问
# 修改数据库链接配置为 mysql, 需要提前在mysql中创建好database
# create database school charset=utf8;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'school',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'mysql'
}
}
# 图片上传与展示
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 需要提前在项目中,创建好 media目录
如果项目运行,报错:
WSGI application 'school.wsgi.application'
,一般是 添加的跨域中间件有错:
- 单词拼错了
- 逗号没写
修改主路由
school/urls.py
为了上传的图片可以正常展示,需要在主路由中做路由映射
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('student.urls')), # 主路由包含子路由,实现路由分发
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
模型类
student/models.py
# 班级:班级名、人数
class Cls(models.Model):
name = models.CharField(max_length=10, verbose_name='班级名')
number = models.IntegerField(default=0, verbose_name='人数')
# 学生:姓名、年龄、头像、所属班级
class Student(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
img = models.ImageField(upload_to='imgs/%Y/%m/%d', verbose_name='头像')
cls = models.ForeignKey(to=Cls, on_delete=models.CASCADE, verbose_name='班级')
# cls属性代表班级对象,包含班级的所有数据:班级名、班级人数
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 生成表
后期在视图操作过程中,报错:
no such table
- 绝对没有迁移生成表
# 查询分类id为1 的所有商品
goods_set = Goods.objects.filter(cate_id=1) # 在商品表中,通过外键查询
cate = Cate.objects.get(id=1) # 在分类表中,通过主键直接查询id为1 的分类对象
# 通过分类对象查询商品。 属于反向查询
cate.goods_set.all() # 通过django内置的方式 , 模型类_set实现反向查询
goods_set = cate.goods_list.all() # 通过外键的related_name属性实现反向查询, 也就是通过分类对象查询对应的商品
序列化器
需要在app中创建自己的序列化文件,如student/serializers.py
from rest_framework.serializers import ModelSerializer
from student.models import *
class ClsModelSerializer(ModelSerializer):
class Meta:
model = Cls
fields = '__all__'
class StudentModelSerializer(ModelSerializer):
class Meta:
model = Student
fields = '__all__'
报错:
AttributeError: 'str' object has no attribute 'values'
- 序列化器中没有写
class Meta
视图
添加班级 POST cls/ form-data
查询所有班级 GET cls/
class ClsAPIView(APIView):
def post(self, request):
# 1. 获取参数
data = request.data
# 2. 创建序列化器对象,添加数据
ser = ClsModelSerializer(data=data)