如何自定义Django多对多关系内联添加下拉框的显示内容?
这个问题我之前做Django项目时也碰到过!默认显示的<Job object (X)>确实太不友好了,解决起来其实很简单,分两种场景给你说:
1. 最直接的解决方案:给Job模型添加__str__方法
这是最基础也最常用的方式,只要在你的Job模型里定义__str__方法,就能让所有地方(包括内联下拉框)显示你自定义的友好名称。
修改你的Job模型代码:
class Job(models.Model): type = models.CharField(max_length=32, choices=JobChoices) guid = models.CharField(max_length=32) title = models.CharField(max_length=256) started_time = models.DateTimeField() ended_time = models.DateTimeField(blank=True, null=True) # 添加这个方法 def __str__(self): # 这里可以自定义显示格式,比如结合类型和标题 return f"{self.get_type_display()} - {self.title}" # 如果只需要标题,就写 return self.title
修改后不需要做数据库迁移,重启服务就能看到下拉框里显示的是你定义的友好名称了。
2. 进阶:Admin内联中更定制化的显示
如果单纯的__str__满足不了你的需求(比如想给下拉框加搜索、排序,或者显示更多字段),可以在对应的Admin内联类里做定制。
举个例子,假设你的关联模型是Project(有一个jobs字段关联到Job),你在ProjectAdmin里用内联展示这个ManyToMany关系,那可以这么配置:
from django.contrib import admin from django.contrib.admin.widgets import FilteredSelectMultiple from .models import Project, Job class JobInline(admin.TabularInline): model = Project.jobs.through # 针对ManyToMany的中间表 extra = 1 def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'job': # 自定义查询集,比如按类型排序 kwargs['queryset'] = Job.objects.order_by('type', 'title') # 带搜索功能的多选框(比默认下拉更友好) kwargs['widget'] = FilteredSelectMultiple('Jobs', is_stacked=False) return super().formfield_for_manytomany(db_field, request, **kwargs) @admin.register(Project) class ProjectAdmin(admin.ModelAdmin): inlines = [JobInline] # 如果你是直接在fields里展示ManyToMany字段,也可以在ProjectAdmin里重写formfield_for_manytomany
这样配置后,内联里的下拉框不仅显示友好名称,还能支持搜索和排序,操作起来更方便。
内容的提问来源于stack exchange,提问作者rubmz
相关产品推荐
相关产品推荐

