我有一个带有
ManyToManyField
的 Django 模型。
渲染管理页面以添加模型实例时,
ModelAdmin
会渲染一个选择框,其中包含SomeModel object(7c158809-4c9b-4d44-b3ac-9f225b8bd076
等选项(模型使用 uuid 作为其主键)。
如何让 Django 管理员使用不同的、更友好的字段呈现选择框?
尽管有最后一个答案,如果您的 Django 版本大于 2.0,一种优化和干净的方法是为您的
SomeModel
定义一个管理页面。就像下面的代码一样:
@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
list_display = ('name', 'created_time', ) # change this part to your fields
search_fields = ('name', ) # If you have this field in your model
然后在源模型管理代码中(其中该模型与
SomeModel
具有 M2M 关系)添加一个属性作为 auto_complete_fields
(从版本 2 添加到 Django)并将其引用到 SomeModelAdmin
。类似于以下代码:
@admin.register(SourceModel)
class SourceModelAdmin(admin.ModelAdmin):
list_display = ("name", "created_time", )
search_fields = ('name', )
autocomplete_fields = ['some_model_field', ] # i.e. your M2M field in that model
当我输入问题时,我想到了解决方案。 Django admin 只是在选择框中显示模型的字符串表示形式。在模型中添加
__str__
定义以及您希望在选择框中渲染对象的方式将解决该问题,如下所示:
class SomeModel(models.Model):
# ... field definitions, including something like name
def __str__(self):
return self.name
检查这个示例,它肯定会消除您在管理站点上呈现相关字段的疑问。
from django.contrib import admin
from . import models
@admin.register(models.Profile) #Decorator
class ProfileAdmin(admin.ModelAdmin):
list_display= ['first_name','last_name','membership','phone','birth_date'] #Columns to display
list_select_related=['user'] #To avoid extra queries
def first_name(self,profile):
return profile.user.first_name #Foreign key relationship
def last_name(self,profile):
return profile.user.last_name #Foreign key relationship
在这个例子中,我正在渲染配置文件模型,其中用户是用户模型的外键,并且用户模型包含名字,姓氏。