Django 5 增删改查 小练习

embedded/2024/10/31 15:19:21/

1. 用命令创建目录和框架

django-admin startproject myapp

cd myapp

py manage.py startapp app

md templates

md static

md media

2. Ai 生成代码

一、app/models.py

python">from django.db import modelsclass Product(models.Model):name = models.CharField(max_length=255, verbose_name="商品名称")description = models.TextField( verbose_name="商品描述")quantity = models.PositiveIntegerField( verbose_name="商品数量")price = models.DecimalField(max_digits=10, decimal_places=2 , verbose_name="商品价格")class Meta:verbose_name = "商品"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass Sale(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE , verbose_name="商品")quantity_sold = models.PositiveIntegerField( verbose_name="销售数量")sale_date = models.DateTimeField(auto_now_add=True , verbose_name="销售日期")class Meta:verbose_name = "销售"verbose_name_plural = verbose_nameclass Purchase(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE , verbose_name="商品")quantity_purchased = models.PositiveIntegerField( verbose_name="购买数量")purchase_date = models.DateTimeField(auto_now_add=True , verbose_name="购买日期")class Meta:verbose_name = "购买"verbose_name_plural = verbose_name

 二、myapp/settings.py

python">ALLOWED_HOSTS = ['*']INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app',
]TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [ BASE_DIR / 'templates'],'APP_DIRS': True,LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'STATIC_URL = 'static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

 三、命令创建数据库

python manage.py makemigrations

python manage.py migrate

四、app/admin.py

python">from django.contrib import admin
from.models import Product, Sale, Purchaseadmin.site.register(Product)
admin.site.register(Sale)
admin.site.register(Purchase)

python manage.py createsuperuser # 创建后台用户 admin  test@qq.com  123456  y 

五、app/views.py

python">from django.shortcuts import render, redirect
from.models import Productdef product_list(request):products = Product.objects.all()total_quantity = sum(product.quantity for product in products)total_price = sum(product.price * product.quantity for product in products)return render(request, 'product_list.html', {'products': products, 'total_quantity': total_quantity, 'total_price': total_price})def add_product(request):if request.method == 'POST':name = request.POST['name']description = request.POST['description']quantity = int(request.POST['quantity'])price = float(request.POST['price'])product = Product(name=name, description=description, quantity=quantity, price=price)product.save()return redirect('product_list')return render(request, 'add_product.html')def update_product(request, product_id):product = Product.objects.get(pk=product_id)if request.method == 'POST':product.name = request.POST['name']product.description = request.POST['description']product.quantity = int(request.POST['quantity'])product.price = float(request.POST['price'])product.save()return redirect('product_list')return render(request, 'update_product.html', {'product': product})def delete_product(request, product_id):product = Product.objects.get(pk=product_id)if request.method == 'POST':product.delete()return redirect('product_list')return render(request, 'delete_product.html', {'product': product})

六、app/urls.py

python">from django.urls import path
from.views import product_list, add_product, update_product, delete_producturlpatterns = [path('products/', product_list, name='product_list'),path('products/add/', add_product, name='add_product'),path('products/update/<int:product_id>/', update_product, name='update_product'),path('products/delete/<int:product_id>/', delete_product, name='delete_product'),
]

七、myapp/urls.py

python">from django.contrib import admin
from django.urls import include, pathfrom app.views import product_list # 导入的视图函数 urlpatterns = [path('admin/', admin.site.urls),path('', product_list, name='home'), # 将根路径映射到 product_list 视图函数path('app/', include('app.urls')), # 将 app 应用中的 URL 映射到 app.urls 模块
]

八、myapp/templates 和 myapp/static

在 static 目录下载 layui (Layui - 极简模块化前端 UI 组件库(官方文档)) 解压到目录

在 templates 创建 product_list.html、add_product.html、delete_product.html、update_product.html

product_list.html

<!DOCTYPE html>
<html>{% load static %}
<head><title>Product List</title><link rel="stylesheet" type="text/css" href="{% static 'layui/css/layui.css' %}">
</head><body><div class="layui-container"><h1>Product List 商品列表</h1><table class="layui-table" lay-skin="line" lay-even><thead><tr><th>Name商品名称</th><th>Description 商品描述</th><th>Quantity 数量</th><th>Price 单价</th><th>Actions </th></tr></thead><tbody>{% for product in products %}<tr><td>{{ product.name }}</td><td>{{ product.description }}</td><td>{{ product.quantity }}</td><td>{{ product.price }}</td><td><a href="{% url 'update_product' product.id %}" class="layui-btn layui-btn-sm layui-btn-normal">Update 修改</a><a href="{% url 'delete_product' product.id %}" class="layui-btn layui-btn-sm layui-btn-danger">Delete 删除</a></td></tr>{% endfor %}</tbody></table><h2>Total Quantity 数量: {{ total_quantity }}</h2><h2>Total Price 总价: {{ total_price }}</h2><a href="{% url 'add_product' %}" class="layui-btn layui-btn-primary">Add Product 增加</a></div>
</body></html>

add_product.html

<!DOCTYPE html>
<html>
{% load static %}
<head><title>Add Product</title><link rel="stylesheet" type="text/css" href="{% static 'layui/css/layui.css' %}">
</head><body><div class="layui-container"><h1>Add Product</h1><form method="post">{% csrf_token %}<label for="name">Name:</label><input type="text" id="name" name="name" required class="layui-input"><br><label for="description">Description:</label><textarea id="description" name="description" class="layui-textarea"></textarea><br><label for="quantity">Quantity:</label><input type="number" id="quantity" name="quantity" required class="layui-input"><br><label for="price">Price:</label><input type="number" step="0.01" id="price" name="price" required class="layui-input"><br><input type="submit" value="Add Product" class="layui-btn"></form>
</div>
</body></html>

delete_product.html

<!DOCTYPE html>
<html>{% load static %}
<head><title>Delete Product</title><link rel="stylesheet" type="text/css" href="{% static 'layui/css/layui.css' %}">
</head><body><div class="layui-container"><h1>Confirm Deletion </h1><p>Are you sure you want to delete 是否要删除 "{{ product.name }}"?</p><form method="post" class="layui-form" >{% csrf_token %}<input type="submit" value="Yes, Delete 删除" class="layui-btn layui-btn-danger"><a href="{% url 'product_list' %}" class="layui-btn layui-btn-primary">Cancel 取消</a></form>
</div>
</body></html>

update_product.html

<!DOCTYPE html>
<html>{% load static %}
<head><title>Update Product</title><link rel="stylesheet" type="text/css" href="{% static 'layui/css/layui.css' %}">
</head><body><div class="layui-container"><h1>Update Product</h1><form method="post">{% csrf_token %}<label for="name">Name:</label><input type="text" id="name" name="name" value="{{ product.name }}" required class="layui-input"><br><label for="description">Description:</label><textarea id="description" name="description" class="layui-textarea" required>{{ product.description }}</textarea><br><label for="quantity">Quantity:</label><input type="number" id="quantity" name="quantity" value="{{ product.quantity }}" required class="layui-input"><br><label for="price">Price:</label><input type="number" step="0.01" id="price" name="price" value="{{ product.price }}" required class="layui-input"><br><input type="submit" value="Update Product" class="layui-btn"></form></div>
</body></html>

八、 运行

python manage.py runserver 

 3. 用TKinter 查看数据表 与出数据

pip install openpyxl

pip install reportlab

myapp/viewSQL.py 

python">import sqlite3
import tkinter as tk
from tkinter import ttk
import openpyxl
from tkinter import messagebox
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import osdef get_table_names():conn = sqlite3.connect('db.sqlite3')cursor = conn.cursor()cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")table_names = [row[0] for row in cursor.fetchall()]conn.close()return table_namesdef fetch_data(table_name):conn = sqlite3.connect('db.sqlite3')cursor = conn.cursor()cursor.execute(f'SELECT * FROM {table_name}')data = cursor.fetchall()conn.close()return datadef display_table_names():names = get_table_names()for item in tree.get_children():tree.delete(item)for name in names:tree.insert('', 'end', values=(name,))def display_data_for_selected_table(event):selected_item = tree.focus()if selected_item:table_name = tree.item(selected_item)['values'][0]data = fetch_data(table_name)for item in data_tree.get_children():data_tree.delete(item)for row in data:data_tree.insert('', 'end', values=row)def export_to_excel():selected_item = tree.focus()if selected_item:table_name = tree.item(selected_item)['values'][0]data = fetch_data(table_name)wb = openpyxl.Workbook()ws = wb.activews.append([f'Column {i + 1}' for i in range(len(data[0]))])for row in data:ws.append(row)filename = f'{table_name}.xlsx'wb.save(filename)messagebox.showinfo("Export Success", f"Data exported to {filename}")def print_to_pdf():selected_item = tree.focus()if selected_item:table_name = tree.item(selected_item)['values'][0]data = fetch_data(table_name)pdf_filename = f'{table_name}_pdf_export.pdf'c = canvas.Canvas(pdf_filename, pagesize=letter)y = 750c.setFont("Helvetica", 12)c.drawString(50, y, f"Table Name: {table_name}")y -= 20for row in data:row_str = ", ".join(str(item) for item in row)c.drawString(50, y, row_str)y -= 15c.save()messagebox.showinfo("PDF Export Success", f"Data printed to {pdf_filename}")def print_to_markdown():selected_item = tree.focus()if selected_item:table_name = tree.item(selected_item)['values'][0]data = fetch_data(table_name)markdown_filename = f'{table_name}_markdown_export.md'with open(markdown_filename, 'w') as f:f.write(f'# {table_name}\n')for row in data:row_str = " | ".join(str(item) for item in row)f.write(f'| {row_str} |\n')messagebox.showinfo("Markdown Export Success", f"Data printed to {markdown_filename}")root = tk.Tk()
root.title("SQLite3 Table Viewer and Exporter 查看器与导出器")# Treeview for table names
tree = ttk.Treeview(root, columns=("Table Name",), show="headings")
tree.heading("Table Name", text="Table Name")
tree.column("Table Name", width=400)
tree.pack(padx=10, pady=10)# Treeview for table data
data_tree = ttk.Treeview(root, columns=("column1", "column2", "column3", "column4", "column5", "..."), show="headings")
for col in ("column1", "column2", "column3", "column4", "column5", "..."):data_tree.heading(col, text=col)data_tree.column(col, width=100)
data_tree.pack(padx=10, pady=10)button_fetch = tk.Button(root, text="Fetch Table Names 查看表名", command=display_table_names)
button_fetch.pack(pady=10)export_button = tk.Button(root, text="Export to Excel 导出为Excel", command=export_to_excel)
export_button.pack(pady=10)print_pdf_button = tk.Button(root, text="Print to PDF 打印为PDF", command=print_to_pdf)
print_pdf_button.pack(pady=10)print_markdown_button = tk.Button(root, text="Print to Markdown 打印为Markdown", command=print_to_markdown)
print_markdown_button.pack(pady=10)tree.bind("<Double-1>", display_data_for_selected_table)root.mainloop()

4. 一键生成 代码 

/app.py

python">import subprocess
import osdef replace_content_in_file(file_path, keyword, new_content):try:with open(file_path, 'r', encoding='utf-8') as file:lines = file.readlines()with open(file_path, 'w', encoding='utf-8') as file:for line in lines:if keyword in line:line = line.replace(keyword, new_content)file.write(line)print(f"成功在文件中找到'{keyword}'并进行了替换。")except FileNotFoundError:print(f"文件 {file_path} 不存在。")# 使用示例
# file_path = 'myapp/settings.py'
# keyword = 'ALLOWED_HOSTS = []'
# new_content = "ALLOWED_HOSTS = ['*']"
# replace_content_in_file(file_path, keyword, new_content)def add_content_after_keyword(file_path, keyword, new_content):try:with open(file_path, 'r', encoding='utf-8') as file:lines = file.readlines()with open(file_path, 'w', encoding='utf-8') as file:for line in lines:if keyword in line:line = line.rstrip() + new_content + '\n'file.write(line)print(f"成功在文件中找到'{keyword}'并添加了内容。")except FileNotFoundError:print(f"文件 {file_path} 不存在。")# 使用示例
# file_path = 'myapp/settings.py'
# keyword = "'django.contrib.staticfiles',"
# new_content = "\n\t'app',"def create_django_project_and_app(project_name, app_name):try:# 创建 Django 项目subprocess.run(["django-admin", "startproject", project_name], check=True)# 切换到项目目录os.chdir(project_name)# 创建应用subprocess.run(["python", "manage.py", "startapp", app_name], check=True)# 创建templates目录os.makedirs('templates', exist_ok=True)# 创建 static 目录os.makedirs('static', exist_ok=True)# 创建media目录os.makedirs('media', exist_ok=True)file_path = project_name +'/settings.py'keyword = "'django.contrib.staticfiles',"new_content = "\n\t"+"'"+app_name+"'"+","add_content_after_keyword(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = 'ALLOWED_HOSTS = []'new_content = "ALLOWED_HOSTS = ['*']"replace_content_in_file(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = "'DIRS': [],"new_content = "'DIRS': [ BASE_DIR / 'templates'],"replace_content_in_file(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = "LANGUAGE_CODE = 'en-us'"new_content = "LANGUAGE_CODE = 'zh-hans'"replace_content_in_file(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = "TIME_ZONE = 'UTC'"new_content = "TIME_ZONE = 'Asia/Shanghai'"replace_content_in_file(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = "from pathlib import Path"new_content = "from pathlib import Path\nimport os"replace_content_in_file(file_path, keyword, new_content)file_path = project_name +'/settings.py'keyword = "STATIC_URL = 'static/'"new_content = "STATIC_URL = 'static/'\nSTATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]\nMEDIA_URL = '/media/'\nMEDIA_ROOT = os.path.join(BASE_DIR, 'media')"replace_content_in_file(file_path, keyword, new_content)# 执行 makemigrations 命令subprocess.run(["python", "manage.py", "makemigrations"], check=True)# 执行 migrate 命令subprocess.run(["python", "manage.py", "migrate"], check=True)# 创建超级用户os.system("python manage.py createsuperuser")# 运行开发服务器subprocess.run(["python", "manage.py", "runserver"], check=True)print(f"成功创建 Django 项目:{project_name},并创建应用:{app_name}")except subprocess.CalledProcessError as e:print(f"创建过程中出现错误:{e}")# 使用示例
# project_name = "myapp"
# app_name = "app"
project_name = input("请输入 Django 项目名称:")
app_name = input("请输入应用名称:")
create_django_project_and_app(project_name, app_name)


http://www.ppmy.cn/embedded/133894.html

相关文章

小满OKKICRM与钉钉数据集成方案解析

小满-宜搭产品同步&#xff1a;小满OKKICRM数据集成到钉钉的技术实现 在企业信息化建设中&#xff0c;系统间的数据集成是提升业务效率和数据一致性的关键环节。本文将聚焦于“小满-宜搭产品同步”方案&#xff0c;详细探讨如何将小满OKKICRM的数据高效、可靠地集成到钉钉平台…

【论文阅读】Persistent Homology Based Generative Adversarial Network

Persistent Homology Based Generative Adversarial Network 摘要 现有的生成模型不能充分捕捉图像的全局结构信息&#xff0c;使得图像生成过程中难以协调全局结构特征和局部细节特征。该文提出了一种基于持续同调的生成对抗网络&#xff08;PHGAN&#xff09;。本文基于持久…

ubuntu双屏只显示一个屏幕另一个黑屏

简洁的结论&#xff1a; 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃&#xff0c;重新安装桌面安装不上&#xff0c;请IT帮忙&#xff0c;IT一番操作过后也表示…

SpringCloud接入nacos配置中心

这里写自定义目录标题 版本选择项目搭建pom.xml本地的 application.ymlchenfu-miniapp-dev.yml 中的配置项接收配置的实体类 版本选择 spring-cloud-Alibaba版本依赖关系 本文章&#xff0c;采用的 springboot 版本是 2.6.13&#xff0c;spring-cloud-alibaba 版本是 2021.0.5…

TypeScript(中)+算法(二)

文章目录 算法排序冒泡排序选择排序 TS类型声明类型推断类型总览js中的数据类型ts中的数据类型原始类型和包装对象原始类型包装对象自动装箱 常用类型与语法anyunknownnevervoidvoid 与 undefined总结 算法 排序 有十种排序算法&#xff0c;分别是&#xff1a;冒泡排序&#…

Milvus - GPU 索引类型及其应用场景

1. 背景概述 Milvus 是一款高效的矢量数据库管理系统&#xff0c;支持在高并发和高调用场景下加速相似度搜索。Milvus 的 GPU 支持由 NvidiaRAPIDS 团队提供&#xff0c;可以借助各种 GPU 索引类型来优化性能。本篇将重点解析 Milvus 支持的 GPU 索引类型、适用场景及各自的性…

ChinaDX服务:快速部署,灵活调整,满足企业多样需求

一、服务概述 ChinaDX&#xff0c;即中国联通提供的AWS跨境直连服务&#xff08;China Unicom China Cross-border Direct Connection Service&#xff09;&#xff0c;是一项专为企业客户设计的云互联解决方案。该服务通过快速连接、高性能、安全、灵活的特性&#xff0c;助力…

【Fastjson反序列化漏洞:深入了解与防范】

一、Fastjson反序列化漏洞概述 Fastjson是一款高性能的Java语言JSON处理库&#xff0c;广泛应用于Web开发、数据交换等领域。然而&#xff0c;由于fastjson在解析JSON数据时存在安全漏洞&#xff0c;攻击者可以利用该漏洞执行任意代码&#xff0c;导致严重的安全威胁。 二、F…