Django项目实践(商城):十一、收货地址

在这里插入图片描述

(根据居然老师直播课内容整理)

一、页面功能简介

  • 在“用户中心”的任一界面,点击左边“收货地址”后,显示下面界面在这里插入图片描述
  • 此界面包括以下4个功能:
    • 新增收货地址
    • 删除当前收货地址
    • 编辑(当前记录收货地址)
    • 设为默认
  • 以4个功能中,“新增收货地址”和“编辑” 需要弹出表单,进行编辑

二、显示收货地址信息页面

1、实现分析

  • 在“用户中心”的任一界面,点击左边“收货地址”
    在这里插入图片描述
  • 前端向后端发起 user/addresses路由发起 get请求
    在这里插入图片描述
  • 后端接收请求,判断用户是否登录
  • 如果已登录,返回页面
  • 如果未登录,跳转到登录页面

2、后端veiw实现

  • 用户登录后才能使用此功能
#  /apps/users/views.py 

class AddressView(LoginRequiredMixin, View):
    """用户收货地址"""
    def get(self, request):
        """提供收货地址界面"""
        return render(request, 'user_center_site.html')

3、路由注册

    #  /apps/users/urls.py 
    
    # 展示用户地址
    path('addresses/', views.AddressView.as_view(),name="addresses"),

三、收货地址数据模型

  • 用户地址模型类定在users应用的models.py中

1、收货地址模型类

class Address(BaseModel):
    """用户地址"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')
    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')
    city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')
    district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')
    email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']  # 按 update_time倒序  排序

2、收货地址模型类说明

  • 收货地址模型类中省、市、县的外键指向areas/models里面的Area。
    • 指明外键时,可以使用应用名.模型类名来定义,也可以使用模型类 在这里插入图片描述
  • ordering表示在进行收货地址模型查询时,默认使用的排序方式。
    • ordering = [’-update_time’] : 根据更新的时间倒叙。

3、补充用户模型默认地址字段

  • 默认地址字段应保存到user表中,与用户绑定,需要修改User模型
    在这里插入图片描述

4、数据库迁移

python manage.py makemigrations
python manage.py migrate

四、新增用户收货地址

在这里插入图片描述

1、接口设计和定义

1.1 请求方式:

选项 方案
请求方法 POST
请求地址 /users/addresses/create/

1.2 请求参数 :

参数名 类型 是否必传 说明
eceiver string 收货人
province_id string 省份ID
city_id string 城市ID
district_id string 区县ID
place string 收货地址
mobile string 手机号
tel string 固定电话
email string 邮箱

1.3 响应结果 : json

响应结果 响应内容
code 状态码
errmsg 错误信息
id 地址ID
receiver 收货人
province 省份名称
city 城市名称
district 区县名称
place 收货地址
mobile 手机号
tel 固定电话
email 邮箱

2、后端view实现

  • 判断用户是否登录
  • 接收参数
    • post参数存放在request.body中
  • 校验参数
    • 必传参数量否传递
    • 手机号校验
    • 如果填有固定电话,固定电话需要校验
    • 如果填了邮箱,邮箱需校验
  • 保存到数据库
  • 根据前端需要,返回详细数据
class AddressCreateView(LoginRequiredJSONMixin, View):
    """新增地址"""
    def post(self,request):
        # 接收参数
        json_dict=json.loads(request.body.decode())
        receiver = json_dict.get('receiver')
        province_id = json_dict.get('province_id')
        city_id = json_dict.get('city_id')
        district_id = json_dict.get('district_id')
        place = json_dict.get('place')
        mobile = json_dict.get('mobile')
        tel = json_dict.get('tel')
        email = json_dict.get('email')

        # 验证
        if not all([receiver,province_id,city_id,district_id,place,mobile]):
            return http.HttpResponseForbidden('缺少必传参数')

        if not re.match(r"^1[3-9]\d{9}$", mobile):
            return http.HttpResponseForbidden('参数mobile有误')

        if tel and not re.match(r'^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$', tel):
            return http.HttpResponseForbidden('参数固定电话有误')

        if not email and not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
            return http.HttpResponseForbidden('参数email有误')

        # 保存
        try:
            address = Address.objects.create(
                user=request.user,
                title=receiver,
                receiver=receiver,
                province_id=province_id,
                city_id=city_id,
                district_id=district_id,
                place=place,
                mobile=mobile,
                tel=tel,
                email=email,
            )
        except Exception as e:
            logging.error(e)
            return http.HttpResponseServerError({"code": RETCODE.DBERR, "errmsg": "新增收获地址失败"})

        # 响应
        address_dict = {
            "id": address.id,
            "receiver": address.receiver,
            "province": address.province.name,
            "city": address.city.name,
            "district": address.district.name,
            "place": address.place,
            "mobile": address.mobile,
            "tel": address.tel,
            "email": address.email
        }
        return http.JsonResponse({"code": RETCODE.OK, "errmsg": "新增收货地址成功", "address": address_dict})

3、定义路由

在这里插入图片描述

4、前端实现

4.1 新增地址JS

        // 新增地址
        save_address(){
   
            if (this.error_receiver || this.error_place || this.error_mobile || this.error_email || !this.form_address.province_id || !this.form_address.city_id || !this.form_address.district_id ) {
   
                alert('信息填写有误!');
            } else {
   
               // 新增地址
               let url = '/users/addresses/create/';
               axios.post(url, this.form_address, {
   
                   headers: {
   
                       'X-CSRFToken':getCookie('csrftoken')
        
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程是一个系列的django实战进阶开发教程,目标是带领大家快速上手实战,课程以最新版本django3.2为蓝本,深入django源码本身,通过内置的类视图来开发,即CBV模式开发,从最基础的类显示视图到类编辑视图再到混入视图,由浅入深,专注Django的高级知识,带你系统的玩转Django,无过多的依赖第三方库,进一步降低学习门槛,更加专注django框架本身!本课程将带你实现一个功能完备的商城系统,如:新闻管理、商品管理(包含多规格)、订单管理、购物车、快速下单、评论、地址、运费模板等常见的商城功能!除此之外,你还可以将本课程内容中涉及到的django类视图的高级用法作为参考资料,在以后的开发中用到的时候再翻阅。认真看完这个系列视频教程之后,您会深入理解django框架的高级知识以及开发流程,具备使用django上手开发实际项目的基本能力!本课程亮点一、少量的第三方依赖,降低学习门槛开发过程中依赖第三方库少,减少大家的进一步的学习理解成本,从而更加专注django框架本身!二、前端轻度结合vue.js,无需过多前端技能本项目将轻度结合vue.js以及fetch来完成一些异步请求,无需过多vue 知识,更贴合后端开发者,也更加靠近当下最热门的技术栈,为前后端分离项目开发打下坚实的基础!三、采用django本身序列化方法构造json,深入django框架本身深度使用Django本身的序列化器来序列化数据,构造一些异步操作的接口,通过这一深度使用对未来使用drf框架将打下坚实的基础,学习drf框架将变的非常容易。四、CBV模式开发,深入Django类视图本项目全部采用Django的类视图,深入学习类视图,不同的请求我们可以在类中使用不同的方法来处理,这样大大的提高了代码的可读性以及高度扩展性,更加便于二次开发!五、多规格产品功能,更符合实际需求网上千篇一律的教程都没有深入讲解多规格商品的实现思路,本专栏将手把手带你完成多规格功能,并且对JD及TB的两种多规格模式的利弊进行深入剖析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值