开发实践10_PurchaseOrder笔记

0 NewProj

01 将source_data材料包放到项目根目录。将其中的static文件夹剪切到根目录。将剩下的temps文件剪切到templates文件夹下。可删source_data。后续用默认sqlite。

STATIC_URL = "/static/"
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')
]

02 python manage.py startapp product。python manage.py startapp users  。python manage.py startapp orders。安装、路由链接。users下temp/usr与login html。

1 users_app (① 登录 退出 ② 登录后登录注册按钮显示为用户名 ③ 点击用户名跳转至用户账户页面)

11 models  迁移

from django.db import modelsclass User(models.Model):user_name = models.CharField(max_length=32, unique=True)password = models.CharField(max_length=128)token = models.CharField(max_length=128, null=True)class Meta:db_table = 'users'@classmethoddef get_list(cls, **kwargs):filters = {}  # 赋值等号有空格,传参等号无空格if kwargs.get('user_name'):filters['user_name'] = kwargs.get('user_name')if kwargs.get('password'):filters['password'] = kwargs.get('password')return cls.objects.filter(**filters)@classmethoddef create_one(cls, user_name, password):return cls.objects.create(user_name=user_name, password=password)@classmethoddef get_one(cls, pk):try:return cls.objects.get(pk=pk)except cls.DoesNotExist:return None

12 html调整

<!DOCTYPE html>
{% load static %}
<html lang="zxx">herf ="{% static 'xxx.cssjsjpgpng'%}"<form action="#">
{% csrf_token %}
<div class="login-form">

13 views 类视图

import timefrom django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import Viewfrom users.models import User
from utils.utils import gen_md5class LoginRegisterView(View):def get(self, request):return render(self.request, 'login_register.html')class RegisterView(View):def post(self, request):user_name = self.request.POST.get('user_name')password = gen_md5(request.POST.get('password'))user = User.get_list(user_name=user_name)if user:return HttpResponse("Occupied user info.")User.create_one(user_name=user_name, password=password)return redirect(reverse("users:login_register"))class LoginView(View):def post(self, request):user_name = self.request.POST.get('user_name')password = gen_md5(request.POST.get('password'))user = User.get_list(user_name=user_name, password=password)if user:user = user.first()user.token = gen_md5(user.user_name) + str(time.time())user.save()self.request.session['user_token'] = user.tokenself.request.session['user_id'] = user.user_idreturn redirect(reverse("users:my_account"))else:return HttpResponse("Wrong Info.")class LogoutView(View):def post(self, request):user_id = request.session.get('user_id')user = User.get_one(pk=user_id)if user:user.token = ""user.save()self.request.session.flush()return redirect(reverse("users:login_register"))class MyAccountView(View):def get(self, request):return render(request, "my_account.html")

14 加密工具。proj/utils.pck/utils.py

import hashlibdef gen_md5(string: str) -> str:md5 = hashlib.md5()md5.update(string.encode('utf-8'))return md5.hexdigest()

15 urls

from django.urls import pathfrom users.views import LoginRegisterView, LoginView, RegisterView, LogoutView, MyAccountViewapp_name = 'users'urlpatterns = [path('login_register/', LoginRegisterView.as_view(), name='login_register'),path('login/', LoginView.as_view(), name='login'),path('register/', RegisterView.as_view(), name='register'),path('logout/', LogoutView.as_view(), name='logout'),path('my_account/', MyAccountView.as_view(), name='my_account'),
]

2 product_app(分页展示;search by category,or name。这里我们假设商品和分类是一对多的关系。)

21 models 注意这里没有完善商品详情。一个oneto'onefield类。迁移

22 views

将图片从admin中上传到前端可static探测到的路径。默认会上传到根目录,需要设置一个media路径。static下new direc product。setting:

STATIC_URL = "/static/"
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')
]# MEDIA_URL = os.path.join(BASE_DIR, 'static', 'product')  # 不设置upload to
MEDIA_URL = os.path.join(BASE_DIR, 'static', 'product')  # 设置upload属性,自动生成文件夹,不需要自己建

23 product model

from django.db import modelsclass Category(models.Model):category_name = models.CharField(max_length=32, verbose_name='category name')class Meta:db_table = 'category'verbose_name = 'category table'verbose_name_plural = verbose_namedef __str__(self):return self.category_name@classmethoddef get_all(cls):return Category.objects.all()class Product(models.Model):product_name = models.CharField(max_length=32, verbose_name='product name')price = models.FloatField(verbose_name='product price')category = models.ForeignKey(Category, on_delete=models.CASCADE)image = models.ImageField(upload_to="product", verbose_name='product image', null=True)class Meta:db_table = 'product'verbose_name = 'product list table'verbose_name_plural = verbose_namedef __str__(self):return self.product_name@classmethoddef get_list(cls, **kwargs):filters = {}if kwargs.get('name'):filters['product_name__contains'] = kwargs.get('name')if kwargs.get('category'):   # obj 一方查多方filters['category'] = kwargs.get('category')return cls.objects.filter(**filters)@classmethoddef get_one(cls, pk):try:return cls.objects.get(pk=pk)except cls.DoesNotExist:return None

admin

from django.contrib import adminfrom product.models import Product, Categoryadmin.site.register([Product, Category,
])

24 views

from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage
from django.shortcuts import render
from django.views import Viewfrom djangoProject1.settings import PAGE_SIZE
from product.models import Product, Categoryfrom users.models import Userclass ProductListView(View):def get(self, request):page_num = self.request.GET.get('page', 1)filters = {'category': self.request.GET.get('category', ""),'name': self.request.GET.get('name', "")}category = Category.get_all()user = ""user_id = self.request.session.get("user_id")if user_id:user_obj = User.get_one(pk=user_id)if user_obj:user = user_obj   # {% if user %}前端作判断用products = Product.get_list(**filters)products_data = []for product in products:products_data.append({'product_name': product.product.name,'price': product.price,'category': product.category.category_name,'image': f"product/{product.image}"})    # 用于分页后前端点语法展示属性paginator = Paginator(products_data, PAGE_SIZE)try:data = paginator.page(page_num)except InvalidPage:data = paginator.page(1)return render(self.request, "shop.html")class ProductDetailView(View):def get(self, request, product_id):product = Product.get_one(pk=product_id)product = {'product_name': product.product.name,'price': product.price,'category': product.category.category_name,'image': f"product/{product.image}"}return render(self.request, 'single_product.html', locals())

25 urls

from django.urls import pathfrom product.views import ProductListView, ProductDetailViewapp_name = 'product'urlpatterns = [path('list/', ProductListView.as_view(), name='list'),path('detail/<int:product_id>/', ProductDetailView.as_view(), name='detail')
]

3 orders_app (展示预订单内容;成交后清空)

31 models

from django.db import modelsfrom product.models import Product
from users.models import Userclass Orders(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="product")quantity = models.IntegerField(verbose_name='Quantity')status = models.IntegerField(default=0, verbose_name='Order Status')  # 支付否user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="user")order_id = models.CharField(max_length=32, verbose_name='Order ID', null=True)class Meta:db_table = 'orders'@classmethoddef get_one(cls, pk):try:return cls.objects.get(pk=pk)except cls.DoesNotExist:return None@classmethoddef get_list(cls, **kwargs):filters = {}if kwargs.get('user'):filters['user'] = kwargs.get('user')if kwargs.get('status') or kwargs.get('status') == 0:filters['status'] = kwargs.get('status')return cls.objects.filter(**filters)@classmethoddef create_one(cls, product, quantity, user):return cls.objects.create(product=product,quantity=quantity,user=user)@classmethoddef batch_update(cls, ids, order_id):for item_id in ids:obj = cls.get_one(item_id)obj.order_id = order_idobj.status = 1obj.save()

32 views

import timefrom django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.shortcuts import render
from django.views import Viewfrom orders.models import Orders
from product.models import Product
from users.models import Userclass OrderDetailView(View):def get(self, request):user_id = self.request.session.get('user_id')if not user_id:return HttpResponse('Not logged in.')user = User.get_one(user_id)orders = Orders.get_list(user=user, status=0)price_list = []order_data = []for order in orders:price_list.append(order.product.price * order.quantity)order_data.append({"product_image": f"{order.product.image}","product_name": order.product.product_name,"product_price": order.product.price,"quantity": order.quantity,"sum": order.quantity * order.product.price})total = sum(price_list)return render(self.request, 'order_detail.html', locals())class OrderAddView(View):def post(self, request):product_id = self.request.POST.get('product_id')product = Product.objects.get(id=product_id)quantity = self.request.POST.get('quantity')user_id = request.session.get('user_id')user = User.get_one(user_id)Orders.create_one(product, quantity, user)return HttpResponse('Added.')class OrderBuyView(View):def post(self, request):ids = list(map(int, self.request.session.get('ids')))order_id = f"Order{time.time()}"Orders.batch_update(ids, order_id)return HttpResponse('Done.')class OrderListView(View):def get(self, request):user_id = self.request.session.get('user_id')user = User.get_one(user_id)orders = Orders.get_list(user=user, status=0)order_data = []prince_list = []for order in orders:prince_list.append(order.product.price * order.quantity)order_data.append({"image": f"product/{order.product.image}","name": order.product.product_name,"price": order.product.price,"quantity": order.quantity,"sum": order.quantity * order.product.price})total = sum(prince_list)return JsonResponse(order_data)

33 urls

from django.urls import pathfrom orders.views import OrderDetailView, OrderBuyView, OrderAddViewapp_name = 'orders'urlpatterns = [path('detail/<order_id>/', OrderDetailView.as_view(), name='detail'),path('buy/', OrderBuyView.as_view(), name='buy'),path('add/', OrderAddView.as_view(), name='add'),
]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者&#xff1a;来自 Jessica Garson 大约一年前&#xff0c;我经历了一段压力很大的时期&#xff0c;最后参加了一场篮球比赛。 在整个过程中&#xff0c;我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数&#xff0c;不论是算法竞赛还是找工作面试笔试&#xff0c;对…

同步復位和異步復位二者各自的優缺點

同步復位和異步復位二者各自的優缺點 一、同步復位&#xff1a;當時鐘上升沿檢測到復位信號&#xff0c;執行復位操作&#xff08;有效的時鐘沿是前提&#xff09;。 always ( posedge clk ); 1.1 優點&#xff1a; a、有利於仿真器的仿真&#xff1b; b、可以使所設計的系…

感悟笔记——2024年2月5日

今日阅读了一篇挺有深度的文章&#xff0c;主要阐述进入职场后的大部分人&#xff0c;是怎么逐渐沦为螺丝钉的?即使起点巨高的优等生&#xff0c;也不可避免。文章指路&#xff1a; 「优等生思维」正在将你变成「螺丝钉」和「老黄牛」从小到大&#xff0c;我一直都是那个「别…

Python类与对象

目录 面向对象 定义类 创建对象 类的成员 实例变量 构造方法 实例方法 类变量 类方法 封装性 私有变量 私有方法 使用属性 继承性 Python中的继承 多继承 方法重写 多态性 继承与多态 鸭子类型测试与多态 面向对象 类和对象都是面向对象中的重要概念。面向…

【react】react+es6+antd5.13.2+ts,antd表格的操作如何在父组件写?

reactes6antd5.13.2ts,antd表格的操作如何在父组件写&#xff1f; 我的子组件columns.tsx&#xff0c;只加表头&#xff0c;操作放在父组件。 columns.tsx的代码&#xff1a; export const dataColumns [{title: 项目成员,dataIndex: name,key: name,},{title: 可选账号,alig…

GNU C和标准C

要理解GNU C和标准C的区别&#xff0c;我们需要先了解C语言的标准化过程以及GNU项目。 标准C&#xff1a; C语言最初由Dennis Ritchie在1973年设计并实现。随着其流行度的增加&#xff0c;为了保证不同编译器之间的可移植性和一致性&#xff0c;美国国家标准局&#xff08;Ame…

非springboot 使用aop 切面

在非Spring Boot应用中使用AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;的代码实现需要依赖Spring AOP库。由于Spring AOP库并不直接支持非Spring应用&#xff0c;你需要将Spring AOP库作为依赖项添加到项目中&#xff0c;并使用Spring AO…

Web课程学习笔记--CSS盒模型

CSS 盒模型 盒模型 网页设计中常听的属性名&#xff1a;内容(content)、填充(padding)、边框(border)、边界(margin)&#xff0c; CSS盒子模式都具备这些属性。 这些属性我们可以把它转移到我们日常生活中的盒子&#xff08;箱子&#xff09;上来理解&#xff0c;日常生活中所…

目标检测:3采用YOLOv8 API训练自己的模型

​ 目录 ​1.YOLOv8 的新特性 2.如何使用 YOLOv8? 3使用YOLOv8训练模型 4.验证训练集 5.测试训练集 6.测验其他图片 7 其他问题 参考: 1.YOLOv8 的新特性 Ultralytics 为 YOLO 模型发布了一个全新的存储库。它被构建为 用于训练对象检测、实例分割和图像分类模型的统…

【JS逆向学习】今日头条

逆向目标 目标网页&#xff1a;https://www.toutiao.com/?wid1707099375036目标接口&#xff1a;https://www.toutiao.com/api/pc/list/feed目标参数&#xff1a;_signature 逆向过程 老规矩先观察网络请求&#xff0c;过滤XHR请求观察加密参数&#xff0c;发现Payload的_s…

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器&#xff0c;源操作数 2、含义解析&#xff1a; &#xff08;1&#xff09;&#xff1a;mov 指令传送数据 案例&#xff1a; MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…

Kafka SASL_SSL双重认证

文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&…

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

【NLP概念合集&#xff1a;一】预训练 Pre-Training&#xff0c;微调 Fine-Tuning 及其方法的概念区别 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念&#xff1a;标签PCA 主成分分析&#xff08;Principal Component Analysis&#xff09;降维算法L…

洛谷 P1408 采药(背包问题应用)

[NOIP2005 普及组] 采药 题目描述 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说&#xff1a;“孩…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

市场复盘总结 20240205

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率低 50% 最常用…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路&#xff1a;深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

[软件工具]文档页数统计工具软件pdf统计页数word统计页数ppt统计页数图文打印店快速报价工具

文档页数统计工具软件——打印方面好帮手 在信息化时代&#xff0c;文档已成为我们工作、学习、生活中不可或缺的一部分。无论是学术论文、商业报告&#xff0c;还是个人日记&#xff0c;都需要我们对其进行有效的管理。而在这个过程中&#xff0c;文档页数统计工具软件就显得…

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统&#xff0c;它提供了灵活的网格化设计能力。其中&#xff0c;fit-content()函数是一项重要的功能&#xff0c;它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景&#xff0c;助你掌…