Настройте раскрывающийся список внешних ключей в Django Admin Site - PullRequest
2 голосов
/ 13 марта 2020

У меня проблемы с поиском лучшего способа переопределить и добавить пользовательский html в форму редактирования / добавления модели на моем Django сайте администратора.

Вот две модели, которые здесь задействованы:

  • Модель значка, используемая для хранения значков «Font Awesome»:
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

Я бы хотела, чтобы этот раскрывающийся список был в эту секунду настраиваемый снимок экрана, аналогичный столбцу «Отображение значков» на этом первом снимке экрана, чтобы пользователь мог выбирать из графического списка значков в отличие от формы поля выбора по умолчанию, содержащей имена значков.

Я просмотрел Django документы, а также аналогичные вопросы о Например, Подобный вопрос о переполнении стека ; Тем не менее, я не совсем понимаю, как правильно реализовать нечто подобное.

Я надеюсь, что предоставленная мною информация о моем приложении полезна. Пожалуйста, дайте мне знать, если вы хотите, чтобы я предоставил какую-либо дополнительную информацию или добавил какие-либо пояснения!

...