06 июля 2023 Python


Имеются две модели: UploadFile и Image

Модель UploadFile содержит данные о загруженных файла FileField, md5hash

class UploadFile(models.Model):

    file = models.FileField(max_length=255)
    md5hash = models.CharField(max_length=32, editable=False, unique=True)

Модель Image содержит ссылку на UploadFile, а так же дополнительные поля Alt, Name и Tags

class Image(TranslatableModel):

    translations = TranslatedFields(
        alt=models.CharField(max_length=50)
    )

    name = models.CharField(_("Name"), max_length=50)

    file = models.ForeignKey(
        UploadFile,
        related_name="images",
        on_delete=models.DO_NOTHING,
    )

То-есть, объект Image может быть связан только с одним UploadFile, а объект UploadFile может быть связан с несколькими Image, а так же File, это необходимо для того чтобы получить централизованое хранилище всех загружаемых файлов, исключить дублирование файлов, а так же позвонить создавать наборы различных описаний файлов.

Необходимо в админ панели объекта Image встроить форму добавления объекта UploadFile, стандартными методами можно получит переопределив классы admin.ModelAdmin, но проще воспользовать готовыми переопределениями в пакете django-reverse-admin

Для создания такой вывернутой наизнанку админки необходимо определить такой класс

class ImageAdmin(TranslatableAdmin, ReverseModelAdmin):
    inline_type = "tabular"
    inline_reverse = ("file", )
    form = ImageForm

    list_display = ("alt", "thumb", "name", "tags_str", "created_at")
    list_filter = (MultiSelectFilter, )
    search_fields = ("translations__alt", "name", "tags")