模板
-
在 templates 目录中新建一个模板文件,如:index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ name }}</h1> <h1>{{ my_list.0 }}</h1> <h1>{{ my_dict.name }}</h1> </body> </html>
-
在settings.py中,配置模板目录
'DIRS': [os.path.join(BASE_DIR, 'templates')]
-
在视图中渲染使用模板
def index(request): context = { 'name': 'django', 'my_list': ['python', 'java', 'php', 'c/c++'], 'my_dict': { 'name': 'python', 'age': 20, 'gender': '男', } } # 方式1 ''' template = loader.get_template('index.html') html_str = template.render(context) return HttpResponse(html_str) ''' # 方式2 return render(request, 'index.html', context)
Admin站点使用
-
修改语言和时区
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
-
创建超级管理员账号:
python manage.py createsuperuser
-
注册模型类到后台
# users/admin.py: from app01.models import Department, Employee class DepartmentAdmin(admin.ModelAdmin): # 在管理后台显示哪些字段信息 list_display = ['id', 'name', 'create_date', 'is_delete'] # 注册模型管理类时,指定ModelAdmin类 admin.site.register(Department, DepartmentAdmin)
-
登录管理后台
http://127.0.0.1:8000/admin
,对数据进行增删改查管理
admin站点列表页控制
# admin.py
class DepartmentAdmin(admin.ModelAdmin):
# 在管理后台显示哪些字段信息
list_display = ['id', 'name', 'create_date', 'is_delete']
# 每页显示的条数
list_per_page = 3
# 显示或隐藏操作栏
actions_on_top = True
actions_on_bottom = True
# 显示过滤栏: 按性别和部门过滤
list_filter = ['gender', 'department']
# 搜索部门名称
search_fields = ['name']
# 注册模型管理类时,指定ModelAdmin类
admin.site.register(Department, DepartmentAdmin)
Admin站点上传图片(ImageField字段使用)
-
实现图片上传功能需要使用Pillow包,安装pillow
pip install Pillow
-
在
settings.py
配置文件中,配置上传的图片保存在哪个目录下MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
-
模型类对应的字段类型要使用ImageField:
class TestUser(models.Model): name = models.CharField(max_length=20) # 用户头像 upload_to='users': 上传的文件保存在 users子目录下 avatar = models.ImageField(upload_to='users', null=True)
-
迁移更新数据库表
python manage.py makemigrations python manage.py migrate
-
注册模型类到admin站点
# admin.py
admin.site.register(TestUser)
- 测试:进入管理后台,新增一条数据,上传图片。
web应用开发模式
-
前后端不分离
- 服务器既要处理业务逻辑,又做渲染模板操作
- 服务器返回html页面或作重定向
- 服务器返回html页面不适用于移动端应用(android, ios)
-
前后端分离
- 服务器仅处理业务逻辑,不做渲染模板操作
- 服务器不返回html,而是返回json/xml
- 服务器能够同时给pc端和移动端应用提供服务
接口开发(API开发): 定义视图和路由,并返回json/xml数据;
RESTful设计风格
RESTful: 接口开发(接口定义)一种被普遍采用设计风格
- 通过url知道 操作的数据是什么
- 通过 请求方法就知道,是做什么操作(增删改查)
- 通状态码知道操作的结果
/employees/?gender=0&page=1
/employee/0/1
请求方法 | 请求地址 | 后端操作 |
---|---|---|
GET | /goods | 获取所有商品 |
POST | /goods | 增加商品 |
GET | /goods/1 | 获取编号为1的商品 |
PUT | /goods/1 | 修改编号为1的商品 |
DELETE | /goods/1 | 删除编号为1的商品 |
- URL
代表一种资源/数据
不使用动词 - 请求方法
GET 查询
POST 添加
PUT 修改
DELETE 删除 - 状态码
200 请求成功(查询、修改)
201 新建成功
204 删除成功
400 请求有误(请求参数有误)
401 用户未认证
403 没有权限访问
404 数据不存在 - 响应数据
查询:返回查询到的数据
新增:返回新增的数据
修改:返回修改后的数据
删除:无需返回数据
接口开发核心工作
-
序列化:对象 --> json
-
反序列化:json --> 对象
-
参数合法性校验
-
业务数据增删改查
案例-使用django开发【重要】
serializable: 序列化: 模型类对象(查询集) --> 字典(列表) --> json/xml
反序列化: json/xml -> 字典 --> 模型类对象
参照讲义的代码
DRF-环境安装与配置
安装drf包
pip install djangorestframework
注册drf应用
INSTALLED_APPS = [
...
'rest_framework', # 注册drf应用
]
DRF-第一个DRF例子
-
定义序列化器
创建序列化器 # rest/serializers.py class DepartmentSerializer(serializers.ModelSerializer): """部门序列化器""" class Meta(object): # 关联的模型类 model = Department # 表示包含模型类中的所有属性 fields = '__all__'
-
编写视图
class DepartmentViewSet(ModelViewSet): # 指定查询集 queryset = Department.objects.all() # 指定视图使用的序列化器 serializer_class = DepartmentSerializer
-
注册路由
# rest/urls.py urlpatterns = [ ... ] # 注册路由(包含了多个url配置项) router = DefaultRouter() router.register(r'departments', views.DepartmentViewSet) urlpatterns += router.urls # 把生成的路由地址 追加到 django 的路由列表中
-
使用 drf 的模板界面进行测试:
# 在浏览器中访问,进行接口测试 http://127.0.0.1:8000/departments/ http://127.0.0.1:8000/departments/1/