在Django管理站点中自定义外键下拉列表

2024-04-19 13:23:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django管理站点中,我很难找到覆盖自定义html并将其添加到编辑/添加模型表单的最佳方法

以下是此处涉及的两个模型:

  • 用于存储“字体真棒”图标的图标模型:
class Icon(models.Model):
    name = models.CharField(max_length=100, null=False)
    style = models.CharField(max_length=10, choices=STYLE_CHOICES, null=False)
    retired = models.BooleanField(default=False)

    def delete(self):
        self.retired = True
        self.save()

    objects = NotRetiredManager()

    objects_deleted = DeletedManager()

    def __str__(self):
        return self.name  

  • 保存对上述图标模型的外键引用的工作簿模型:
class Workbook(models.Model):
    client = models.ForeignKey(Client, on_delete=models.SET_NULL, null=True)
    icon = models.ForeignKey(Icon, on_delete=models.SET_NULL, null=True, blank=True)    
    name = models.CharField(max_length=100)
    workbookLink = models.CharField(max_length=1000)
    retired = models.BooleanField(default=False)

    def delete(self):
        self.retired = True
        self.save()

    objects = NotRetiredManager()

    objects_deleted = DeletedManager()

    def __str__(self):
        return self.name  

以下是上述模型的替代管理模型:

class BaseAdmin(AdminImageMixin, admin.ModelAdmin):
    def delete_queryset(self, request, queryset):
        for obj in queryset:
            obj.delete()

@admin.register(Workbook)
class WorkbookAdmin(BaseAdmin):

    list_display = ("name", "client")
    list_filter = (NameFilter, ClientNameFilter)

    ordering = ("name", )

@admin.register(Icon)
class IconAdmin(BaseAdmin):
    fields = ("name", "style", "icon_display")

    list_display = ("icon_display", "name", "style" )
    list_display_links = ("icon_display", "name")
    list_filter = (NameFilter, )

    ordering = ("name", )

    def icon_display(self, obj):
        return mark_safe(f'<i class="{obj.style}{obj.name}"></i>')

    readonly_fields = ["icon_display"]

以下是我数据库中一些图标的列表显示: Screenshot of Icon List Display Page on Admin Site

当前,我的管理网站上工作簿的“添加/编辑”页面如下所示: Screenshot of Workbook Edit page on Admin Site

我希望第二个屏幕截图中的下拉列表可以自定义,类似于第一个屏幕截图中的“图标显示”列,以便用户可以从图标的图形列表中进行选择,而不是从包含图标名称的默认choicefield表单中进行选择

我研究了Django文档以及类似的问题,比如这个Similar Stack Overflow Question;然而,我还没有完全理解实现这种东西的正确方法

我希望我提供的关于我的应用程序的信息是有用的。请让我知道,如果你想让我提供任何额外的信息,或添加任何澄清


Tags: name模型selftrueobjmodelsdefdisplay