Django 的 ModelAdmin 有没有办法在渲染 ManyToMany 选择框时显示不同的字段?

问题描述 投票:0回答:3

我有一个带有

ManyToManyField
的 Django 模型。

渲染管理页面以添加模型实例时,

ModelAdmin
会渲染一个选择框,其中包含
SomeModel object(7c158809-4c9b-4d44-b3ac-9f225b8bd076
等选项(模型使用 uuid 作为其主键)。

如何让 Django 管理员使用不同的、更友好的字段呈现选择框?

django django-models django-admin
3个回答
1
投票

尽管有最后一个答案,如果您的 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

0
投票

当我输入问题时,我想到了解决方案。 Django admin 只是在选择框中显示模型的字符串表示形式。在模型中添加

__str__
定义以及您希望在选择框中渲染对象的方式将解决该问题,如下所示:

class SomeModel(models.Model):
    # ... field definitions, including something like name

    def __str__(self):
        return self.name

0
投票

检查这个示例,它肯定会消除您在管理站点上呈现相关字段的疑问。

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

在这个例子中,我正在渲染配置文件模型,其中用户是用户模型的外键,并且用户模型包含名字,姓氏。

© www.soinside.com 2019 - 2024. All rights reserved.