Django项目之电商购物商城 -- 创建收货地址

Django项目之电商购物商城 – 创建收货地址

一. 在users中创建新的视图与路由用于创建收货地址

# 设置收货地址
class AddressView(View):
    def get(self , request):
        return render(request , "user_center_site.html")
# 设置收货地址
    path('user_center_site/', views.AddressView.as_view() , name = 'user_center_site')

二. 创建新的app – areas 用于显示省市区等收货地址

1. 创建模型类使用自关联方式关联所有数据

from django.db import models



class AreaModles(models.Model):
    area_name = models.CharField(max_length=20)
    parent = models.ForeignKey('self',  on_delete=models.SET_NULL , null=True,blank=True,related_name='subs' )


    class Meta:
        db_table = 'areas'

三. 创建视图

  1. 在请求页面的时候会首先发送一次请求获取到全国的省份 , 该请求不携带任何参数

    在这里插入图片描述

  2. 当点击省份后, 会获取该省份的所有市 , 在请求过程中会携带市的id , 可以用此来区分不同的请求

    在这里插入图片描述

    在这里插入图片描述

  3. 创建视图用来获取全国的省份数据

    from django.views import View
    from areas.models import AreaModles
    from django.http import JsonResponse
    from utils.response_code import RETCODE
    
    # 获取全国城市名称
    class SetAreasView(View):
        def get(self , request):
            area_id = request.GET.get('area_id')
            # 判断是否携带参数
            if not area_id:
                province_modle_list = AreaModles.objects.filter(parent_id__isnull=True)
                province_list = []
                for province_modle in province_modle_list:
                    province_dict = {
                        'id' : province_modle.id,
                        'name' : province_modle.area_name,
                    }
                    province_list.append(province_dict)
    
                print(province_list)
    
                return JsonResponse({
                    'code' : RETCODE.OK,
                    'errmsg' : "OK",
                    'province_list' : province_list
                })
            else:
                # 获取到当前选择的省份
                sub_province = AreaModles.objects.get(id = area_id)
                print(sub_province.area_name)
    
                # 获取当前省份的所有市区
                sub_area_list = sub_province.subs.all()
    
                sub_list = []
                for sub_area in sub_area_list:
                    sub_area_dict = {
                        'id' : sub_area.id,
                        'name' : sub_area.area_name,
                    }
                    sub_list.append(sub_area_dict)
                print(sub_list)
    
                sub_data = {
                    'id' :sub_province.id,
                    'name' : sub_province.area_name,
                    'subs' : sub_list
                }
    
                return JsonResponse({
                    'code' : RETCODE.OK,
                    'errmsg' : "OK",
                    'sub_data' : sub_data
                })
    
  4. 对前端进行修改循环遍历获得所有数据

    <div class="form_group">
                        <label>*所在地区:</label>
                        <select v-model="form_address.province_id">
                            <option value="0">请选择</option>
                            <option :value="province.id" v-for="province in provinces" >[[province.name]]</option>
    
                        </select>
                        <select v-model="form_address.city_id">
                            <option value="0">请选择</option>
                            <option :value="city.id" v-for="city in cities" >[[city.name]]</option>
                        </select>
                        <select v-model="form_address.district_id">
                            <option value="0">请选择</option>
                            <option :value="district.id" v-for="district in districts" >[[district.name]]</option>
                        </select>
                    </div>
    
  5. 那么就到此为止了吗 , 是否可以再优化一下?

    当多用户进行设置是不可避免的会对数据库查询造成巨大的压力 , 我们可以将查询到的数据缓存到内存中 , 设置缓存时间

    那么就会大大减少数据库的压力

    from django.shortcuts import render
    from django.views import View
    from areas.models import AreaModles
    from django.http import JsonResponse
    from utils.response_code import RETCODE
    from django.core.cache import cache
    
    # 获取全国城市名称
    class SetAreasView(View):
        def get(self , request):
    
            # 从缓存中获取数据
            province_list = cache.get('province_list')
    
            # 判断是否携带参数
            area_id = request.GET.get('area_id')
            if not area_id:
    
                # 如果数据不存在获取数据
                if not province_list:
                    province_modle_list = AreaModles.objects.filter(parent_id__isnull=True)
                    province_list = []
                    for province_modle in province_modle_list:
                        province_dict = {
                            'id' : province_modle.id,
                            'name' : province_modle.area_name,
                        }
                        province_list.append(province_dict)
    
                    cache.set('province_list' , province_list , 3600)
    
                    """
                    {
                        'code' : 200,
                        'errmsg' : "OK",
                        'province_list' : [
                            { 'id' : 1 ,'name' : '北京'},
                            { 'id' : 2 ,'name' : '上海'},
                            { 'id' : 3 ,'name' : '南京'},
                            .......
                              
                    }
                    """
    
                return JsonResponse({
                    'code' : RETCODE.OK,
                    'errmsg' : "OK",
                    'province_list' : province_list
                })
    
    
    
            else:
                sub_data = cache.get(f'sub_data_{area_id}')
    
                if not sub_data:
                    # 获取到当前选择的省份
                    sub_province = AreaModles.objects.get(id = area_id)
    
                    # 获取当前省份的所有市区
                    sub_area_list = sub_province.subs.all()
    
                    sub_list = []
                    for sub_area in sub_area_list:
                        sub_area_dict = {
                            'id' : sub_area.id,
                            'name' : sub_area.area_name,
                        }
                        sub_list.append(sub_area_dict)
    
                    sub_data = {
                        'id' :sub_province.id,
                        'name' : sub_province.area_name,
                        'subs' : sub_list
                    }
                    cache.set(f'sub_data_{area_id}' , sub_data , 3600)
    
                return JsonResponse({
                    'code' : RETCODE.OK,
                    'errmsg' : "OK",
                    'sub_data' : sub_data
                })
    
    
    
    
    
    
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web前端学习笔记9

9. HTML5新增元素及属性 9.1 HTML5新增结构元素 HTML5引入了几个新的结构元素,极大地改善了网页的组织和结构方式。以下是HTML5中的一些关键新结构元素: 标签说明<header>页面或页面中某一个区块的页眉,通常是一些引导和导航信息<nav>可以作为页面导航的链接组&…

【c++】线程池的原理及实现

&#x1f4bb;文章目录 &#x1f4c4;前言线程池的原理概念工作原理 线程池的实现线程池的基础结构任务队列的实现工作线程的实现 线程池的应用与拓展线程池的拓展 &#x1f4d3;总结 &#x1f4c4;前言 不知道各位是否有试过点进限时抽奖网站、抢票网站呢&#xff1f;你是否好…

第19讲:Ceph集群CrushMap规则定制与调优:从基础到高级应用

文章目录 1.CrushMap规则拓扑结构1.1.集群默认的CrushMap规则拓补图1.2.自定义的CrushMap规则拓补图 2.定制CrushMap规则的方法以及注意事项3.通过二进制文件编写一套CrushMap规则3.1.将系统默认的CrushMap规则导出3.2.根据需求编写CrushMap规则3.3.将编写好的规则导入到集群中…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目&#xff0c;celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配&#xff0c;有些celery的版本不支持python的版本&#xff0c;具体的版本请看…

计算机毕业设计 | vue+springboot汽车销售管理系统(附源码)

1&#xff0c;项目介绍 本项目基于spring boot以及Vue开发&#xff0c;前端实现基于PanJiaChen所提供的开源后台项目vue-element-admin改造。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理。 2&…

记录如何查询域名txt解析是否生效

要查询域名的TXT记录&#xff0c;可以使用nslookup命令。具体步骤如下&#xff1a;12 打开命令行终端。输入命令 nslookup -qttxt 域名&#xff0c;将"域名"替换为你要查询的实际域名。执行命令后&#xff0c;nslookup会返回域名的TXT记录值。 如何查询域名txt解析是…

面试题库-项目

1.项目主要实现了哪些功能&#xff1f; 本项目是专门为校园食堂窗口定制的一款软件产品&#xff0c;包括系统管理后台和客户端两部分。其中系统管理后台主要提供给食堂内部员工使用&#xff0c;可以对餐厅的菜品、套餐、订单、员工等进行管理维护。客户端主要提供给学生及校职…

什么是分库分表?代表性框架有哪些?

在互联网系统开发过程中&#xff0c;所谓的分库分表并不是一个新概念。或者说&#xff0c;对于很多开发人员而言&#xff0c;说起分库分表&#xff0c;大家都或多或少有所了解&#xff0c;也都知道数据量大了就需要进行分库分表。但是究竟如何实现分库分表呢&#xff1f; 要想…

创建Spring Boot项目及配置

目录 一、创建项目所需要的插件 1、安装插件 二、创建项目 三、创建项目所面临的常见问题。 1、IDEA不能识别 2、无效的发行版本 3、确认jar包是否下载成功 一、创建项目所需要的插件 1、安装插件 首先需要在IDEA插件里面搜索Spring&#xff0c;选择Spring Boot Helper…

什么是短信群发上行和下行

短信群发是一种广泛应用于商业和个人通信的技术&#xff0c;通过一次多条的方式&#xff0c;可以快速高效地传递信息。在实际的群发过程中&#xff0c;会涉及到上行和下行的概念。本文将详细介绍什么是短信群发上行和下行&#xff0c;并解释它们的应用。 什么是短信群发上行 群…

Dbeaver连接一段时间不操作后断开的问题

右键数据库连接点击编辑连接点击初始化将连接保持改成60s

BW4HANA混合建模 用ADSO的哪个视图?

写日志的ADSO除了1,2,3表之外。还会有6,7,8view。8view是上了BW4HANA2.0之后激活ADSO就会生成的。如果旧版本没有8&#xff0c;那就RSDG_ADSO_ACTIVATE激活一下。 如果勾了外部HANA视图&#xff0c;那就等于说还有一个HANA view。 首先咱知道ADSO是BW里面用来物理存储&#xf…

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip&#xff0c;软件使用pycharm&#xff0c;安装也都很简单 首先需要安装pyside6,在终端执行&#xff1a; pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

BLIP和BLIP2 论文讲解

文章目录 BLIPIntroductionMethod模型架构预训练目标字幕和过滤&#xff08;Capfilt&#xff09; BLIP2IntroductionMethod模型结构Q-Former预训练第一阶段Q-Former预训练第二阶段 BLIP 论文&#xff1a; 《BLIP: Bootstrapping Language-Image Pre-training for Unified Visio…

详解BOM编程

华子目录 BOM编程window对象常见的window对象的属性常见的window对象的方法注意 history对象history对象的属性history对象的方法 screen 对象navigator 对象属性方法 location对象属性方法示例 BOM编程 JavaScript本质是在浏览器中运行&#xff0c;所以JavaScript提供了BOM&a…

一文详解FDA邮件认证证书的重要性及其应用

随着全球化和电子商务的飞速发展&#xff0c;跨国贸易和沟通变得越来越频繁。在这个过程中&#xff0c;邮件作为重要的沟通工具&#xff0c;其安全性和可信度成为了各方关注的焦点。FDA&#xff08;美国食品药品监督管理局&#xff09;邮件认证证书就是在这一背景下应运而生的一…

1W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPV-SAR 系列

TPV-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…

【全开源】Java共享台信息共享系统源码

特色功能 信息整合与共享&#xff1a;该平台提供一站式信息整合服务&#xff0c;将各种类型的信息资源进行汇聚&#xff0c;方便用户快速查找和获取所需资源。多种共享功能&#xff1a;支持信息共享、共享车位、共享会议室、共享电动车等多种共享功能&#xff0c;提高资源利用…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库&#xff0c;所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代&#xff0c;数据库管理是许多企业和个人项目的核心。设…
最新文章