如何在Django Admin中为Law模型创建带筛选的LatestAmendedLaws子板块
解决方案
一、添加Admin子板块LatestAmendedLaws
通过Proxy模型复用Law模型数据,同时实现自定义筛选逻辑:
- 在models.py中创建Proxy模型:
from django.db import models from django.utils import timezone from datetime import timedelta class LatestAmendedLaws(Law): class Meta: proxy = True verbose_name = "最近修改的法律" verbose_name_plural = "最近修改的法律"
- 修改admin.py,注册Proxy模型并设置筛选规则:
from django.contrib import admin from .models import Law, LatestAmendedLaws from django.utils import timezone from datetime import timedelta @admin.register(Law) class LawAdmin(admin.ModelAdmin): list_display = ( 'id', 'rs_number', 'created' ) @admin.register(LatestAmendedLaws) class LatestAmendedLawsAdmin(admin.ModelAdmin): list_display = ('id', 'rs_number', 'created') # 自动筛选最近20天修改的法律(created字段同步更新) def get_queryset(self, request): qs = super().get_queryset(request) return qs.filter(created__gte=timezone.now() - timedelta(days=20))
完成后,Django Admin左侧菜单会新增「最近修改的法律」子板块,直接展示符合条件的法律条目。
二、实现法律修改后的邮件通知
假设自定义命令位于management/commands/amend_laws.py,修改命令逻辑完成邮件发送:
- 在settings.py中配置邮件参数(以SMTP为例):
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = '你的SMTP服务器地址' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的发件邮箱' EMAIL_HOST_PASSWORD = '邮箱授权码' ADMINS = [('管理员姓名', 'admin@example.com')] # 接收通知的管理员邮箱 SITE_DOMAIN = 'https://你的Django站点域名' # 站点域名,用于生成Admin链接
- 修改自定义命令代码:
from django.core.management.base import BaseCommand from django.core.mail import send_mail from django.urls import reverse from django.conf import settings from .models import Law class Command(BaseCommand): help = '每20天修改法律并发送通知' def handle(self, *args, **options): # 替换为你的实际法律修改逻辑 amended_laws = Law.objects.all() for law in amended_laws: # 执行修改操作,save时created字段自动更新 law.save() # 构造邮件内容,包含Admin跳转链接 subject = '法律修改完成通知' message = '以下法律已完成修改,请登录Admin验证:\n\n' for law in amended_laws: # 生成Admin编辑页面的完整URL admin_url = f"{settings.SITE_DOMAIN}{reverse('admin:你的应用名_law_change', args=[law.id])}" message += f"- 法律ID: {law.id}, RS编号: {law.rs_number} | 查看链接: {admin_url}\n" # 发送邮件给所有管理员 send_mail( subject, message, settings.EMAIL_HOST_USER, [admin[1] for admin in settings.ADMINS], fail_silently=False, ) self.stdout.write(self.style.SUCCESS('法律修改完成,通知邮件已发送'))
注意:将代码中的你的应用名替换为Law模型所在的应用名称,确保URL生成正确。
内容的提问来源于stack exchange,提问作者Mahdi Jafari
相关产品推荐
相关产品推荐

