在Django admin中显示只读GenericForeignKey值

时间:2018-08-29 10:58:08

标签: django django-models django-admin

我有一个与UserOrganization有通用关系的Django模型。该模型如下所示:

class Project(models.Model):
    # ...
    client_type = models.ForeignKey(
        'contenttypes.ContentType',
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        limit_choices_to=(
            models.Q(app_label='users', model='user') |
            models.Q(app_label='organizations', model='organization')
        )
    )
    client_id = models.PositiveIntegerField(blank=True, null=True)
    client = GenericForeignKey('client_type', 'client_id')
    # ...

我可以使用以下命令在项目管理员列表中显示该项目的客户端名称:

@admin.register(models.Project)
class ProjectAdmin(admin.ModelAdmin):
    list_display = (
        '__str__',
        'client',
    )

但是,我找不到在项目的实际更改页面中显示客户端名称的简单方法。我尝试了明显的方法:

fields = (
    'name',
    'client',
)

但是这会产生一个错误,提示client不是有效的字段名称。我阅读了Django文档的Using generic relations as an inline部分,但他们的示例似乎...向后?

我只想显示谁是客户的名字,不必编辑。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

list_display自动将所有字段视为只读。但是为了在更改页面上显示GenericForeignKey字段,您需要将其显式设置为只读:

read_only_fields = ('client', )

您遇到的错误确实令人不安,它也使我绊了几次。