Условное поле в Django (Admin)

Я использую Django ORM для моделирования моей базы данных/объектов, и Django Admin для отображения моих страниц администратора (включая вложенные страницы администратора).

Я хотел реализовать следующее, но безуспешно: У меня есть модель 'project'. Затем у меня есть модель 'file', с отношением ForeignKey к 'project'. В модели файла есть поле 'filetype'.

SUPPORTED_FILE_TYPES = (
    ('csv', 'csv'),
    ('xls', 'xls'),
)

class Project(models.Model):
    name = models.CharField(max_length=200)

class File(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    filetype = models.CharField(
        max_length=20,
        choices=SUPPORTED_FILE_TYPES,
        default=SUPPORTED_FILE_TYPES[0],
    )

Затем в Django admin я просто вложилAdmin, чтобы убедиться, что я могу добавлять файлы прямо из представления проекта.

class FileInline(nested_admin.NestedStackedInline):
    model = File
    extra = 0
    inlines = [ColumnInline]


class ProjectAdmin(nested_admin.NestedModelAdmin):
    inlines = [FileInline]
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
    }

Теперь "файл" может быть как файлом excel, так и файлом csv. Каждый из них имеет различные атрибуты (например, файл excel имеет 'sheets', в то время как csv имеет поля 'delimiter' и 'thousand_seperator'). Я хочу, чтобы, когда я добавляю файл и выбираю тип файла, появлялись поля формы, принадлежащие выбранному типу файла. Я долго ломал голову над тем, как это реализовать. Несколько вариантов приходили мне в голову:

  1. Using GenericForeignKeys, but I didn't manage to get the desired result: the admin lets me choose a model, but not enter the fields of selected model. enter image description here
class ExcelFile(models.Model):
    sheet_name = models.CharField(max_length=100)


class CsvFile(models.Model):
    thousand_separator = models.CharField(max_length=1)
    delimiter = models.CharField(max_length=1)


class File(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    filename = models.CharField(max_length=200)

    file_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('file_type', 'object_id')

  1. Using 'django-polymorphic' to have Excel and CSV subclasses from a parent file model - but that didn't play nice with nested admin

Упускаю ли я какой-то очевидный способ моделирования этой связи? Какой подход был бы предпочтительным?

Вернуться на верх