如何在Django Admin中重命名ManyToMany关联表的显示名称?
Django ManyToMany关联表Admin名称问题解答
1. 这是预期结果吗?
是预期结果。当你在Django中定义ManyToManyField但未指定自定义中间模型时,Django会自动生成一个中间关联表,并且在Admin后台默认使用“[模型A名称]-[模型B名称] relationships”作为该表的显示名称。
2. 如何重命名为友好名称?
直接给ManyToManyField设置verbose_name、related_name或db_table无法修改Admin中的显示名称,需要通过自定义中间模型来实现:
步骤1:定义自定义中间模型
创建一个继承自models.Model的中间模型,添加关联ModelA和ModelB的外键,并在Meta类中设置verbose_name和verbose_name_plural:
class ModelA(models.Model): id = models.AutoField(primary_key=True) # 指定through参数关联自定义中间模型 name = models.ManyToManyField(ModelB, through='ModelABRelation') class ModelB(models.Model): id = models.AutoField(primary_key=True) # 自定义中间关联模型 class ModelABRelation(models.Model): model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE) model_b = models.ForeignKey(ModelB, on_delete=models.CASCADE) class Meta: verbose_name = "A-B关联关系" verbose_name_plural = "A-B关联关系" # 添加唯一约束,避免重复关联记录 unique_together = ('model_a', 'model_b')
步骤2:(可选)保留原ManyToMany选择界面
使用自定义中间模型后,Admin默认会显示中间模型的单独编辑页面。如果想保留原来的多选框界面,需要在ModelA的Admin配置中添加filter_horizontal或filter_vertical:
from django.contrib import admin from .models import ModelA, ModelB, ModelABRelation class ModelAAdmin(admin.ModelAdmin): filter_horizontal = ('name',) admin.site.register(ModelA, ModelAAdmin) admin.site.register(ModelB) # 若需要单独管理关联记录,可注册中间模型 # admin.site.register(ModelABRelation)
这样设置后,Admin后台中的关联表显示名称就会替换为你自定义的友好名称。
内容的提问来源于stack exchange,提问作者Superad
相关产品推荐
相关产品推荐

