【问题标题】:Django display list of ForeingKey relationshipDjango 显示外键关系列表
【发布时间】:2019-04-09 14:42:36
【问题描述】:

我正在使用 django 2 和 python 3。

在我的模型中,我的用户可以拥有应用程序列表。应用程序只能有一个所有者。 我像这样使用了 ForeingKey:

class User(AbstractUser):
    # nothing interresting for this question here
    pass


class StoreApplication(models.Model):
    owner = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="applications"
    )

现在我想在用户的管理页面中列出用户的应用程序,例如应用程序名称列表,只是只读的东西。不在列表视图中,在编辑视图中。

我知道 InlineModelAdmin,但它似乎无法解决我的问题,因为它包含每个用户应用程序的整个申请表。

如果我尝试在我的用户管理员中将该字段引用为“应用程序”:

class UserAdmin(admin.ModelAdmin):
    list_display = ("username", )

    fieldsets = (
        ("Général", {
            "fields": ("username", "applications", )
        }),
    )

发生错误: Unknown field(s) (applications) specified for User. Check fields/fieldsets/exclude attributes of class UserAdmin.

【问题讨论】:

  • ModelAdmin 一样,InlineModelAdmin 可以自定义为仅包含您想要的字段(使用fields = ...),如果您愿意,也可以只包含只读字段,方式完全相同。这是显示多对多关系的所有相关模型的唯一方法(除了定义您自己的方法,例如返回相关模型的某个值的逗号分隔列表的方法)

标签: django django-admin


【解决方案1】:

您可以向 UserAdmin 添加一个方法,以逗号分隔列表的形式返回所有应用程序。我将假设 StoreApplication 模型上有一个用于命名对象(名称)的 CharField

def get_applications(self, obj):
    return ', '.join([app.name for app in obj.applications])

# set the short_description to how you want that field displayed in admin
get_applications.short_description = 'Applications'

然后只需将 get_applications 添加到 fields 和 readonly_fields

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2019-01-21
    • 2016-07-29
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2016-11-12
    相关资源
    最近更新 更多