如何在Django Admin中获取外键精确值(终端与航班调度场景)
Django Admin 外键独立显示自定义字段解决方案
针对Mio_flight_schedule模型的terminal_code和gate_code外键字段,要在Django Admin中分别显示终端名称、闸口号而非默认的对象字符串,且不修改模型的__str__方法,可通过以下两种方式实现:
方法一:自定义ModelChoiceField字段类
在项目的admin.py中编写如下代码:
from django.contrib import admin from django.forms import ModelChoiceField from .models import Mio_terminal, Mio_flight_schedule # 自定义终端外键选择字段,显示终端名称 class CustomTerminalChoiceField(ModelChoiceField): def label_from_instance(self, obj): return obj.terminal_name # 替换为Mio_terminal中存储终端名称的字段名 # 自定义闸门外键选择字段,显示闸口号 class CustomGateChoiceField(ModelChoiceField): def label_from_instance(self, obj): return obj.gate_number # 替换为gate模型中存储闸口号的字段名 class MioFlightScheduleAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): # 为terminal_code指定自定义字段 if db_field.name == 'terminal_code': kwargs['form_class'] = CustomTerminalChoiceField # 为gate_code指定自定义字段 elif db_field.name == 'gate_code': kwargs['form_class'] = CustomGateChoiceField return super().formfield_for_foreignkey(db_field, request, **kwargs) # 注册模型与自定义Admin类 admin.site.register(Mio_terminal) admin.site.register(Mio_flight_schedule, MioFlightScheduleAdmin)
方法二:直接修改字段的label_from_instance(更简洁)
同样在admin.py中编写:
from django.contrib import admin from .models import Mio_terminal, Mio_flight_schedule class MioFlightScheduleAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): field = super().formfield_for_foreignkey(db_field, request, **kwargs) # 为terminal_code设置显示终端名称 if db_field.name == 'terminal_code': field.label_from_instance = lambda obj: obj.terminal_name # 为gate_code设置显示闸口号 elif db_field.name == 'gate_code': field.label_from_instance = lambda obj: obj.gate_number return field admin.site.register(Mio_terminal) admin.site.register(Mio_flight_schedule, MioFlightScheduleAdmin)
注意事项
- 请将代码中的
terminal_name、gate_number替换为你实际模型中存储对应内容的字段名; - 两种方法均仅作用于Django Admin界面,不会修改模型本身的
__str__方法,不影响其他场景下的对象字符串表示。
内容的提问来源于stack exchange,提问作者swapnil wagh
相关产品推荐
相关产品推荐

