第1步:在users应用下views.py中新增实现修改收货地址的视图类
class UpdateDestroyAddressView(LoginRequiredJSONMixin, View):
def put(self, request, address_id):
"""修改收货地址"""
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 HttpResponseForbidden('缺少必传参数')
if not re.match(r'^1[3-9]\d{9}$', mobile):
return HttpResponseForbidden('参数mobile有误')
if tel:
if not re.match(r'^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$', tel):
return HttpResponseForbidden('参数tel有误')
if email:
if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return HttpResponseForbidden('参数email有误')
# 判断地址是否存在,并更新地址信息
try:
Address.objects.filter(id=address_id).update(
user=request.user, title=receiver, receiver=receiver,
province_id=province_id, city_id=city_id, place=place,
district_id=district_id, mobile=mobile, tel=tel,
email=email
)
except Exception as e:
logger.error(e)
return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '更新地址失败'})
# 构造响应数据
address = Address.objects.get(id=address_id)
address_dict = {
"id": address.id, "title": address.title,
"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 JsonResponse({'code': RETCODE.OK, 'errmsg': '更新地址成功', 'address': address_dict})
def delete(self, request, address_id):
# 获取默认收货地址的id
default_address_id = request.user.default_address
# 判断用户删除的是否是默认收货地址,如果是,那么将默认收货地址字段设置为None,
# 如果不是,那么直接删除
try:
address = Address.objects.get(id=address_id)
if default_address_id == address.id:
request.user.default_address_id = None
request.user.save()
address.is_deleted = True
address.save()
except Exception as e:
logger.error(e)
return JsonResponse({'code': RETCODE.DBERR,
'errmsg': '删除地址失败'})
# 返回响应结果
return JsonResponse({'code': RETCODE.OK, 'errmsg': '删除地址成功'})
第2步:在users应用下配置路由
path('addresses/<int:address_id>/', views.UpdateDestroyAddressView.as_view()),