【问题标题】:Django Admin custom foreign key select boxDjango Admin 自定义外键选择框
【发布时间】: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 管理中的选项中显示图像的缩略图。

现在我的选择框是这样的

【问题讨论】:

    标签: django python-3.x django-admin jquery-select2 django-jet


    【解决方案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/…
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2016-08-22
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多