Django выбирает, какую модель использовать в админке Django
models.py
class Cluster(models.Model):
blockOption= (('IMG', 'IMG'),('DESC', 'DESC'),)
block = models.CharField(max_length= 100, choices=blockOption)
order= models.IntegerField(null=True)
post = models.ForeignKey(Post, verbose_name=('Link to Post'), on_delete=models.CASCADE)
class Image(models.Model):
src = models.ImageField(verbose_name=('Imagefile'))
captions= models.CharField(max_length= 100, null=True)
cluster = models.ForeignKey(Cluster, verbose_name=('Link to Post'), on_delete=models.CASCADE)
class Description(models.Model):
text=models.TextField(max_length=400)
cluster = models.ForeignKey(Cluster, verbose_name=('Link to Post'), on_delete=models.CASCADE)
и в admin.py
class ImageAdminInline(TabularInline):
extra = 1
model = Image
class DescriptionAdminInline(TabularInline):
model= Description
@admin.register(Cluster)
class ClusterAdmin(admin.ModelAdmin):
inlines= (ImageAdminInline, DescriptionAdminInline)
Я поместил ImageAdminInline и DescriptionAdminInline в качестве инлайнов в ClusterAdmin. Я планирую использовать ClusterAdmin для выбора администратора, которого я буду использовать. Я надеюсь, что это будет что-то похожее на streamfield (изображение выше). Есть ли какое-нибудь решение, которое я мог бы использовать, не переопределяя шаблон администратора?
Я пробовал использовать Ajax, чтобы просто скрыть или показать инлайны, но это был мой первый раз, когда я переопределял шаблон django, поэтому это не удалось.
Вы можете создать два отдельных класса администратора, один для Image, другой для Description, а затем использовать поле block в модели Cluster для определения того, какой класс администратора использовать в админке Django. Вот пример:
class ImageAdmin(admin.ModelAdmin):
pass
@admin.register(Description)
class DescriptionAdmin(admin.ModelAdmin):
pass
@admin.register(Cluster)
class ClusterAdmin(admin.ModelAdmin):
def get_model_admin(self, request, obj=None):
if obj and obj.block == "IMG":
return ImageAdmin
elif obj and obj.block == "DESC":
return DescriptionAdmin
else:
return super().get_model_admin(request, obj)
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
model_admin = self.get_model_admin(request, obj)
if model_admin:
form.base_fields.update(model_admin.get_form(request, obj, **kwargs).base_fields)
return form
Это будет использовать ClusterAdmin как основной класс администратора для модели Cluster, но он будет динамически использовать либо ImageAdmin, либо DescriptionAdmin для отображения соответствующих полей на основе значения поля блока в модели Cluster.