Администратор Django устанавливает значение extra равным 0 при редактировании

#django #django-admin

#python #python-3.x #джанго #django-модели #django-admin

Вопрос:

Настройка extra = 1 в моей модели всегда показывает 1 пустое поле. Это нормально при вставке нового элемента, но я не хочу показывать дополнительное пустое поле при редактировании. Как я могу это сделать?

models.py:

 class Foo(models.Model):
    bar = models.ForeignKey(Bar, models.CASCADE, related_name='bars')
    title = models.CharField(_('Title'), max_length=255)
    body = models.TextField(_('Body'))
    __str__(self):
        return '%s' % (self.title)
 

admin.py:

 class FooInline(admin.StackedInline):
    model = Foo
    extra = 1 #Also shows 1 extra empty field while editing.
              #I don't want to show if there is already a non-empty field

class FooAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}
    inlines = [FooInline]
 

Ответ №1:

Переопределите метод get_extra вместо установки значения для дополнительного члена класса.

Возвращает количество дополнительных встроенных форм для использования. По умолчанию возвращает атрибут InlineModelAdmin.extra.

Переопределите этот метод, чтобы программно определить количество дополнительных встроенных форм. Например, это может быть основано на экземпляре модели (переданном в качестве ключевого слова аргумент obj):

Что-то вроде:

 def get_extra(self, request, obj=None, **kwargs):
    if obj.bar_set.count() :
        return 0
    else: 
        return 1
 

Комментарии:

1. Еще один вопрос, если у меня есть несколько моделей, допустим, они находятся на одной странице администратора, есть ли какой-нибудь способ наследовать или я должен жестко закодировать это для каждой встроенной модели? (Извините, если я неправильно использовал некоторые термины)

2. да, вы можете создать свой собственный базовый администратор и расширить его

Ответ №2:

Используйте «get_extra ()» для управления количеством дополнительных пустых полей, как показано ниже:

 # "admin.py"

class FooInline(admin.StackedInline):
    model = Foo
    # extra = 1

    def get_extra(self, request, obj=None, **kwargs):
        if obj:
            return 0 # For changing an item
        else: 
            return 1 # For adding a new item

class FooAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}
    inlines = [FooInline]