Условное поле в 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'). Я хочу, чтобы, когда я добавляю файл и выбираю тип файла, появлялись поля формы, принадлежащие выбранному типу файла. Я долго ломал голову над тем, как это реализовать. Несколько вариантов приходили мне в голову:
- 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.

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')
- Using 'django-polymorphic' to have Excel and CSV subclasses from a parent file model - but that didn't play nice with nested admin
Упускаю ли я какой-то очевидный способ моделирования этой связи? Какой подход был бы предпочтительным?