django的model.py admin.py views.py 中 的可循环遍历的 精简案例

ops/2024/12/19 9:14:57/

使用循环来写models.py中的模型

使用循环来写admin.py中的定义后台栏目

使用循环来写api

如下面这个图中,推荐多个商品,字段变量是有逻辑的变换的
在这里插入图片描述

它的api的接口内容为:

{"articles": [{"title_cn": "测试文章1【标题】","title_en": null,"summary_cn": "文章概括中文","summary_en": "","content_cn": "文章富文本--中文:","content_en": "","product_1": true,"product_1_title_cn": "有推荐商品1","product_1_title_en": null,"product_1_summary_cn": "有推荐商品1的商品大致概括","product_1_summary_en": "","product_1_link_cn": null,"product_1_link_en": null,"image_1": null,"tag_choice_1": "circle_image","product_2": false,"product_2_title_cn": "有推荐商品2","product_2_title_en": null,"product_2_summary_cn": "","product_2_summary_en": "","product_2_link_cn": null,"product_2_link_en": null,"image_2": null,"tag_choice_2": "no_image","product_3": false,"product_3_title_cn": null,"product_3_title_en": null,"product_3_summary_cn": "","product_3_summary_en": "","product_3_link_cn": null,"product_3_link_en": null,"image_3": null,"tag_choice_3": "no_image","product_4": false,"product_4_title_cn": null,"product_4_title_en": null,"product_4_summary_cn": "","product_4_summary_en": "","product_4_link_cn": null,"product_4_link_en": null,"image_4": null,"tag_choice_4": "no_image","product_5": false,"product_5_title_cn": null,"product_5_title_en": null,"product_5_summary_cn": "","product_5_summary_en": "","product_5_link_cn": null,"product_5_link_en": null,"image_5": null,"tag_choice_5": "no_image","created_at": "2024-12-17T17:14:43.173Z","updated_at": "2024-12-17T17:14:43.173Z","change_count": 0,"modification_times": []}]
}

使用循环来写models.py中的模型

这时,models.py中的可以配置为

from django.db import models
from django.utils import timezone
import jsonclass Article(models.Model):# 图片形状的选项NO_IMAGE = 'no_image'CIRCLE_IMAGE = 'circle_image'SQUARE_IMAGE = 'square_image'TRIANGLE_IMAGE = 'triangle_image'HEXAGON_IMAGE = 'hexagon_image'IMAGE_TAG_CHOICES = [(NO_IMAGE, '无图片'),        # 无图片(CIRCLE_IMAGE, '圆形图片'), # 圆形图片(SQUARE_IMAGE, '方形图片'), # 方形图片(TRIANGLE_IMAGE, '三角形图片'), # 三角形图片(HEXAGON_IMAGE, '六边形图片'),   # 六边形图片] # 标题字段title_cn = models.CharField(max_length=255, verbose_name='文章中文标题')title_en = models.CharField(max_length=255, blank=True, null=True, verbose_name='文章英文标题')# 文章概括字段summary_cn = models.TextField(verbose_name='文章概括中文')summary_en = models.TextField(blank=True, null=True, verbose_name='文章概括英文')# 内容字段content_cn = models.TextField(verbose_name='文章富文本--中文')content_en = models.TextField(blank=True, null=True, verbose_name='文章富文本--英文')## 动态生成推荐商品和图片字段 Recommended Products (Repeat 5 times)for i in range(1, 6):locals()[f'product_{i}'] = models.BooleanField(default=False, verbose_name=f'推荐商品{i}【打勾后将会在主页列表中显示推荐】')locals()[f'product_{i}_title_cn'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--中文')locals()[f'product_{i}_title_en'] = models.CharField(max_length=255, blank=True, null=True, verbose_name=f'推荐商品{i}标题--英文')locals()[f'product_{i}_summary_cn'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--中文')locals()[f'product_{i}_summary_en'] = models.TextField(blank=True, null=True, verbose_name=f'推荐商品{i}商品大致概括--英文')locals()[f'product_{i}_link_cn'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--中文')locals()[f'product_{i}_link_en'] = models.URLField(blank=True, null=True, verbose_name=f'推荐商品{i}的链接--英文')# 图片字段和对应的标签选择字段# locals()[f'image_{i}'] = models.ImageField(upload_to='images/', verbose_name=f'图片{i}路径')# 使图片字段可为空locals()[f'image_{i}'] = models.ImageField(upload_to='images/',verbose_name=f'图片{i}路径',null=True,  # 允许数据库中此字段为nullblank=True  # 允许表单中此字段为空)# 商品图片形状locals()[f'tag_choice_{i}'] = models.CharField(max_length=20,choices=IMAGE_TAG_CHOICES,default=NO_IMAGE,verbose_name=f'图片{i}标签选择')# # 时间戳字段 Timestampscreated_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='最后修改时间')change_count = models.PositiveIntegerField(default=0, verbose_name='更改次数')# 修改时间(存储为JSON列表) Modification Times (stored as a JSON list)modification_times = models.TextField(default='[]', verbose_name='修改时间')class Meta:verbose_name = '文章'verbose_name_plural = '文章'def __str__(self):return self.title_cndef save(self, *args, **kwargs):if self.pk:self.change_count += 1mod_times = json.loads(self.modification_times)mod_times.append(timezone.now().isoformat())self.modification_times = json.dumps(mod_times)super().save(*args, **kwargs)def get_modification_times(self):return json.loads(self.modification_times)

使用循环来写admin.py中的定义后台栏目

from django.contrib import admin
from django.utils.html import format_html
from .models import Articleclass ArticleAdmin(admin.ModelAdmin):list_display = ('title_cn', 'title_en', 'summary_cn', 'summary_en', 'recommended_products_count', 'created_at', 'updated_at', 'change_count')search_fields = ('title_cn', 'title_en')# Define fieldsets to organize form layoutfieldsets = (('标题', {'fields': (('title_cn', 'title_en'),)}),('概括', {'fields': (('summary_cn', 'summary_en'),)}),('内容', {'fields': (('content_cn', 'content_en'),)}),)# Dynamically add fieldsets for recommended productsfor i in range(1, 6):fieldsets += ((f'推荐商品{i}', {'fields': (f'product_{i}', f'product_{i}_title_cn', f'product_{i}_title_en', f'product_{i}_summary_cn', f'product_{i}_summary_en', f'product_{i}_link_cn', f'product_{i}_link_en',f'image_{i}', f'tag_choice_{i}')}),)readonly_fields = ('created_at', 'updated_at', 'change_count', 'modification_times')def recommended_products_count(self, obj):count = sum([getattr(obj, f'product_{i}') for i in range(1, 6)])if count:return format_html('<span>✔</span> {}', count)else:return format_html('<span>✖</span> {}', count)recommended_products_count.short_description = '推荐商品数量'admin.site.register(Article, ArticleAdmin)

使用循环来写api

views.py


from django.shortcuts import render
from django.core.paginator import Paginator
from .models import Article
from django.http import JsonResponsedef latest_articles_json(request):articles = Article.objects.all().order_by('-created_at')[:10]articles_list = []for article in articles:article_data = {'title_cn': article.title_cn,'title_en': article.title_en,'summary_cn': article.summary_cn,'summary_en': article.summary_en,'content_cn': article.content_cn,'content_en': article.content_en,'created_at': article.created_at,'updated_at': article.updated_at,'change_count': article.change_count,'modification_times': article.get_modification_times(),}# Add product and image detailsfor i in range(1, 6):article_data.update({f'product_{i}': getattr(article, f'product_{i}'),f'product_{i}_title_cn': getattr(article, f'product_{i}_title_cn'),f'product_{i}_title_en': getattr(article, f'product_{i}_title_en'),f'product_{i}_summary_cn': getattr(article, f'product_{i}_summary_cn'),f'product_{i}_summary_en': getattr(article, f'product_{i}_summary_en'),f'product_{i}_link_cn': getattr(article, f'product_{i}_link_cn'),f'product_{i}_link_en': getattr(article, f'product_{i}_link_en'),f'image_{i}': getattr(article, f'image_{i}').url if getattr(article, f'image_{i}') else None,f'tag_choice_{i}': getattr(article, f'tag_choice_{i}'),})articles_list.append(article_data)return JsonResponse({'articles': articles_list})

http://www.ppmy.cn/ops/143144.html

相关文章

java中枚举的使用

文章目录 1 枚举1.1 自定义类实现枚举1.2 enum 关键字实现枚举1.2.1 enum 关键字使用注意事项1.2.2 枚举类 enum 常用方法说明(1) toString() 方法&#xff0c;返回当前对象名&#xff0c;子类可以重写。(2) name() 方法&#xff0c;返回当前对象名&#xff08;常量名&#xff…

Qt C++ OpenCV实现人脸跟踪

一、概述 通过 Qt 和 OpenCV 组合实现人脸跟踪系统,可以将实时视频中的人脸检测和跟踪功能应用于监控、功能识别等场景。OpenCV 提供的前处理和模型装载功能,进一步与 Qt 的繁荣应用程序展示功能相结合,可以极大地提升实时处理效果。 二、环境汇总 安装必要软件Qt Framewo…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

学习记录(13):VR晕动症-VR Motion Sickness

文章目录 前言一、感官运动冲突二、视觉辐辏调节冲突三、模糊 前言 学习参考链接&#xff1a;https://zhuanlan.zhihu.com/p/629833652 常见的引发VR晕动症的原因有三种&#xff0c;分别是感官运动冲突、视觉辐辏调节冲突、视觉模糊。 一、感官运动冲突 感官运动冲突主要指的…

单片机:实现蜂鸣器数码管的显示(附带源码)

单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示&#xff0c;而数码管则用于显示数字或字母。在本项目中&#xff0c;我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统&#xff0c;结合使用蜂鸣器和数码管&#xf…

网络安全创新实验

一、网络拓扑设计 二、网络主机概况 本实验一共包含4台虚拟机&#xff0c;分别为攻击机attacker&#xff0c;网关gateway&#xff0c;内网普通用户主机pc&#xff0c;内网服务器server&#xff0c;四台主机的详细信息如下表所示&#xff1a; 名称操作系统IP地址网络模式作用攻…

Unity UI Button 事件优先级调整技术方案

Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中&#xff0c;针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法&#xff0c;旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…

游戏引擎学习第49天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们当时在讨论我们必须要进行一些改进&#xff0c;以便在游戏中实现更好的碰撞检测。当时展示了一种非常基本的形式&#xff0c;以十字路口为例来实现碰撞交叉工作。然后我们意识到需要升级到更复杂的水平&#xff0c;以便…