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")