用户中心,收货地址

dj鲜生-32-用户中心-收货地址_get方法

本页主要有两方面需要处理

》收货地址的显示,get请求

》表单的提交,可用post请求

表单的模板页处理

》先让模板页的界面变继承一下

参考 user_center_info页

继承一个母版

重写一个右侧的块

图示为,要参考的代码

dj鲜生-32-用户中心-收货地址_表单_02

》继承

关注 user_center_info 的right_content里包的div的样式,复制一下

dj鲜生-32-用户中心-收货地址_数据_03

》来到用户中心的地址页、

通过搜索,快速定位到盒子

dj鲜生-32-用户中心-收货地址_表单_04

盒子收起来

dj鲜生-32-用户中心-收货地址_get方法_05

前后都删掉

dj鲜生-32-用户中心-收货地址_表单_06

继承一个

dj鲜生-32-用户中心-收货地址_post请求_07

重写块

dj鲜生-32-用户中心-收货地址_数据_08

试试效果

dj鲜生-32-用户中心-收货地址_控件_09
页面正常显示

模板页中,表单的完善

提交方式改为post提交

给控件添加name值

dj鲜生-32-用户中心-收货地址_表单_10

dj鲜生-32-用户中心-收货地址_控件_11

注意,post提交加上csrf_token

dj鲜生-32-用户中心-收货地址_控件_12

》小结

  • 表单用post请求发送
  • 给表单控件添加name值
  • post表单需要加csrf_token,防止跨域伪造的请求

视图类回顾

》原来的

仅仅只做了页面的渲染
dj鲜生-32-用户中心-收货地址_get方法_13

通过get方法来渲染显示页面

可是如果用户提交数据,会走post方式

所以要新增post方法

视图类的post方法

》先写好逻辑

dj鲜生-32-用户中心-收货地址_表单_14

》开始完善功能

》接收数据

dj鲜生-32-用户中心-收货地址_数据_15

》校验数据

验证空数据
dj鲜生-32-用户中心-收货地址_表单_16

dj鲜生-32-用户中心-收货地址_数据_17

验证手机格式

dj鲜生-32-用户中心-收货地址_get方法_18

dj鲜生-32-用户中心-收货地址_get方法_19

得到正则式,直接使用

dj鲜生-32-用户中心-收货地址_表单_20

》业务处理

先上逻辑

        # 业务处理
        # 保存用户提交的地址
        # 情况1,如果用户首次提交地址,让这个地址为默认地址
        # 情况2,如果已经有一个默认地址了,新提交的地址为非默认地址

地址表结构回顾

dj鲜生-32-用户中心-收货地址_get方法_21

》开始

确保地址模型类导入
dj鲜生-32-用户中心-收货地址_get方法_22

》获取登陆的用户对象

然后进行查询

查一查这个用户的地址数据中,有没有存在着默入地址的数据

如果有一个地址被设置为了默认地址

那么新增的地址就为非默认的

否则,就新增的这个地址就让它作为默认地址

        # 保存用户提交的地址
        # 情况1,如果用户首次提交地址,让这个地址为默认地址
        # 情况2,如果已经有一个默认地址了,新提交的地址为非默认地址

        # 获取用户行对象
        user = request.user
        try:
            # 在地址表中查找,登陆的用户,地址中默认值为True的数据
            address = Address.objects.get(user=user, is_default=True)
        except Address.DoesNotExist:
            # 如果查找不到,会进入本分支
            address = None

        # 如果地址查到了,表明用户已经有默认地址了
        if address:
            is_default = False
        else:
            is_default = True

        # 添加地址
        Address.objects.create(
            user=user,
            receiver=receiver,
            zip_code=zip_code,
            phone=phone,
            addr=addr,
            is_default=is_default
        )

dj鲜生-32-用户中心-收货地址_数据_23

》返回应答

跳转

dj鲜生-32-用户中心-收货地址_数据_24

跳转到了当前路径

又会被get方法处理

此时的get请求来自于post数据的提交后的跳转

get渲染的页面,应该要把数据库中已经存在着的数据渲染到页面中

因此,get方法不能够仅仅只是像原来那样了

视图类的get方法

当前get渲染的数据是假数据

dj鲜生-32-用户中心-收货地址_表单_25

做下修改

让get方法查询数据

把数据传递给模板

dj鲜生-32-用户中心-收货地址_表单_26

模板页的调改

把数据填入
dj鲜生-32-用户中心-收货地址_数据_27

测试功能

》访问地址页

dj鲜生-32-用户中心-收货地址_控件_28

dj鲜生-32-用户中心-收货地址_控件_29

dj鲜生-32-用户中心-收货地址_get方法_30

效果完成

逻辑小结

dj鲜生-32-用户中心-收货地址_表单_31

get方法的逻辑

通过orm查询

地址对象 = 模型类.object.get(用户名=登陆用户,是否默认=True)