You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin中为Law模型创建带筛选的LatestAmendedLaws子板块

解决方案

一、添加Admin子板块LatestAmendedLaws

通过Proxy模型复用Law模型数据,同时实现自定义筛选逻辑:

  1. 在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 = "最近修改的法律"
  1. 修改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,修改命令逻辑完成邮件发送:

  1. 在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链接
  1. 修改自定义命令代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:31:05