Django выбирает, какую модель использовать в админке Django

enter image description here У меня есть три модели

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.

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