Django Admin:如何从父模型视图重定向到子模型视图?
当然可以实现!
要让Django Admin里的制造商名称点击后跳转到关联的汽车列表页面,只需要自定义Manufacturer的Admin类,给名称字段添加跳转链接即可,具体步骤如下:
1. 优化反向关联名称(可选但推荐)
先提个小细节:你当前Car模型里的related_name="manufacturers"有点容易混淆,因为这个参数是用来定义从Manufacturer反向访问Car的属性名,比如manufacturer.manufacturers.all()读起来怪怪的。建议改成更清晰的related_name="cars",修改后的Car模型如下:
class Car(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE, related_name="cars") # 其他相关字段
如果不想修改原代码也没关系,后续代码对应调整参数即可。
2. 自定义Manufacturer Admin类
在你的admin.py文件中,创建自定义的ManufacturerAdmin类,通过自定义列表字段来生成带跳转的链接:
from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from .models import Manufacturer, Car class ManufacturerAdmin(admin.ModelAdmin): # 用自定义的带链接字段替换原有的name字段,也可以添加到现有list_display中 list_display = ('linked_name',) def linked_name(self, obj): # 生成Car Admin列表页面的基础URL car_changelist_url = reverse( 'admin:{}_{}_changelist'.format( Car._meta.app_label, Car._meta.model_name ) ) # 添加过滤参数,只显示当前制造商的汽车 # 如果你没修改related_name,这里参数名要改成manufacturers__id filtered_url = f"{car_changelist_url}?manufacturer__id={obj.id}" # 返回安全的HTML链接 return format_html('<a href="{}">{}</a>', filtered_url, obj.name) # 给自定义字段设置显示名称 linked_name.short_description = '制造商名称' # 注册自定义的Admin类 admin.site.register(Manufacturer, ManufacturerAdmin) admin.site.register(Car)
3. 实现原理说明
reverse('admin:{}_{}_changelist'):Django内置的URL反转方法,用来生成对应模型的Admin列表页面地址,无需硬编码URL路径,适配不同的项目配置。- 过滤参数
?manufacturer__id={obj.id}:Admin原生支持通过URL参数进行列表过滤,这里指定只显示关联当前制造商ID的汽车记录,跳转后会自动应用过滤条件。 format_html():用来安全生成HTML内容,避免XSS攻击,是Django官方推荐的方式(替代旧版的allow_tags属性)。
设置完成后,刷新Manufacturer的Admin列表页面,点击制造商名称就会自动跳转到过滤好的对应汽车列表啦!
内容的提问来源于stack exchange,提问作者Paras
相关产品推荐
相关产品推荐

