Django Admin如何根据URL参数country_id在新页面仅展示指定Inline
解决方案
你需要调整3处核心逻辑即可实现需求:
1. 首先注册代理模型的Admin
你定义的BrandOrderFilter代理模型和对应的BrandOrderFilteringAdmin需要先注册到Django Admin,才能使用原生Admin的路由和渲染能力:
# 放在admin.py的末尾即可,注意替换your_app为你实际的应用名 admin.site.register(BrandOrderFilter, BrandOrderFilteringAdmin)
2. 精简BrandOrderFilteringAdmin配置,隐藏所有原模型字段
直接屏蔽原模型的所有字段,页面就只会渲染你指定的Inline:
class BrandOrderFilteringAdmin(admin.ModelAdmin): inlines = [CorporateBrandOrderFilterAdmin,] # 直接返回空字段列表,原模型的所有字段都不会渲染 def get_fields(self, request, obj=None): return [] # 可选:如果不需要删除/新增父对象的权限,可以直接禁用 def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False
3. 修改跳转链接,直接指向代理模型的编辑页
你之前定义的filter_brand空视图完全可以删除,直接跳转代理Admin的原生编辑路由即可,同时要带上当前父对象的ID:
def get_countries(self, instance): from django.urls import reverse country_list = '<ul style="font-weight: bold;list-style-type:circle;">' countries = Country.objects.all() for country in countries: # 替换your_app为实际应用名,路由名格式为admin:{{应用名}}_{{代理模型小写名}}_change url = reverse('admin:your_app_brandorderfilter_change', args=(instance.id,)) country_list += f'<li class="changelist"><a href="{url}?country_id={country.id}" target="_blank">{country.name}</a></li>' country_list+='</ul>' return mark_safe(country_list)
如果不确定代理模型的路由名,可以执行python manage.py show_urls | grep brandorderfilter查看实际的路由标识。
你已经写好的Inline按国家过滤的逻辑不需要修改,直接就能生效。
内容的提问来源于stack exchange,提问作者Kishore Kumar
相关产品推荐
相关产品推荐

