Django Admin 自定义外键选择框

Posted

技术标签:

【中文标题】Django Admin 自定义外键选择框【英文标题】:Django Admin custom foreign key select box 【发布时间】:2020-01-10 05:41:12 【问题描述】:

我想自定义 Django 管理员选择框并在图片标题旁边的选择框中显示缩略图

我有一个名为 Image 的类和另一个名为 News 的类,它们有一个 Image 的外键。

注意:我使用 Django jet 作为管理模板。

class Image(models.Model):
    alternate = models.CharField(
        verbose_name=_('Alternate'),
        max_length=255,
        null=True,
        blank=True
    )
    title = models.CharField(
        verbose_name=_('Title'),
        max_length=255,
        null=True,
        blank=True
    )
    artist = models.ManyToManyField(
        'Artist',
        verbose_name=_('Artist'),
        blank=True
    )
    image = models.ImageField()

    def __str__(self):
        return "() ".format(self.pk, self.title)

    class Meta:
        verbose_name = _('Image Attachment')
        verbose_name_plural = _('Image Attachments')

    @staticmethod
    def autocomplete_search_fields():
        return 'title',

class News(BaseModel):
    title = models.CharField(
        verbose_name=_('Title'),
        max_length=255,
        null=True,
        blank=True
    )
    summery = RichTextField(
        verbose_name=_('Summery'),
        null=True,
        blank=True,
    )
    main_image = models.ForeignKey(
        Image,
        verbose_name=_('Main Image'),
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='images'
    )

现在,当我想添加新闻时,我想在 Django 管理中的选项中显示图像的缩略图。

现在我的选择框是这样的

【问题讨论】:

【参考方案1】:

您需要创建一个继承自Select 的自定义小部件,看起来最重要的部分是将option_template_name 设置为您创建的用于显示图像的模板。由于您使用的不是基本的 Django Admin,因此您可能需要考虑扩展该库中的小部件。

类似的东西:

class SelectWithImage(Select):
    ...
    option_template_name = 'myapp/forms/widgets/select_option_with_image.html'
    ...

然后按照here 的描述在你的 admin.py 中为 News 模型调整管理员 formfield_overrides,然后你就可以开始了!

此步骤将如下所示:

from django.contrib import admin
from django.db import models

# Import our custom widget and our model from where they're defined
from myapp.models import News
from myapp.widgets import SelectWithImage

class NewsAdmin(admin.ModelAdmin):
    formfield_overrides = 
        models.ForeignKey: 'widget': SelectWithImage,
    

【讨论】:

感谢您的重播。在选择中,我只有 __str__ 和一个对象的 id。如何访问对象的其他功能。默认模板:<option value=" widget.value|stringformat:'s' "% include "django/forms/widgets/attrs.html" %> widget.label </option> 然后您需要进一步覆盖 ChoiceWidget 类,很可能是 create_option github.com/django/django/blob/…

以上是关于Django Admin 自定义外键选择框的主要内容,如果未能解决你的问题,请参考以下文章

自定义/删除 Django 选择框空白选项

如何在 Django-admin 中添加自定义搜索框?

Django admin:将选定的相关字段框更改为自动完成

Django 后台定制自己的选择框删除函数

Django admin 中的自定义相关下拉菜单

python测试开发django-37.外键(ForeignKey)查询