Администратор Django: скрыть поля только для чтения в новых записях? - PullRequest
5 голосов
/ 23 февраля 2011

Я использую сайт администратора Django с некоторыми полями только для чтения на записях:

class BookAdmin(admin.ModelAdmin):
    fieldsets = [
    (None, {'fields': ['title', 'library_id', 'is_missing', \
                       'transactions_all_time']}),
    ]
    readonly_fields = ['transactions_all_time',]
    list_display = ('library_id', 'author', 'title')

Это прекрасно работает при редактировании записей - поле transactions_all_time доступно только для чтения, как я хочу.

Однако при добавлении новых записей это ведет себя немного странно.Внизу страницы появляется раздел только для чтения, который я не могу редактировать и который на данный момент не имеет значения.

Было бы намного лучше, если бы это поле вообще не присутствовало при добавлении новыхзаписей.

Есть ли опция Django, чтобы при добавлении новой записи не отображались поля, доступные только для чтения?Я знаю, что могу взломать CSS на add_form.html, чтобы скрыть его, но есть ли лучший способ?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 31 марта 2011

У меня была похожая проблема.Решил это вот так

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ('field_one',)
    def get_readonly_fields(self, request, obj=None):
        if obj: # Editing
            return self.readonly_fields
        return ()
3 голосов
/ 25 мая 2013

Вот сухая версия решения Кушала:

def get_fieldsets(self, request, obj=None):
    def if_editing(*args):
        return args if obj else ()
    return (
        (None, {
            'classes': ('wide',),
            'fields': if_editing('admin_thumb', 'admin_image',) +
                      ('original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )  

Обратите внимание, что это работает только в основной форме - во встроенной форме вы передаете основной объект, а не встроенный объект.

1 голос
/ 10 мая 2013

У меня была похожая проблема с немного другим решением. Я хотел скрыть превью изображений (поля только для чтения) из формы «new» (представление «add»), но отображать их при извлечении нового объекта:

class PhotoAdmin(admin.ModelAdmin):
readonly_fields = ('admin_image', 'admin_thumb', )
search_fields = ('filename', 'user', 'supplier', 'customer')
list_display= ('admin_thumb','filename', 'user', 'supplier', 'customer')
#fields = ('admin_thumb', 'admin_image', 'original_image', 'user', 'supplier', 'customer')


def get_fieldsets(self, request, obj=None):
    fieldset_existing = (
        (None, {
            'classes': ('wide',),
            'fields': ('admin_thumb', 'admin_image',
                'original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )
    fieldset_new = (
        (None, {
            'classes': ('wide',),
            'fields': ('original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )
    if obj: # Editing
        return fieldset_existing
    return fieldset_new

Строка #fields показывает исходные поля. Я признаю, что это решение не очень «СУХОЕ», но оно ясное и простое.

0 голосов
/ 23 февраля 2011

другой альтернативой является установка аргумента editable в исходной модели.

class Book(models.Model):
    transactions_all_time = models.BooleanField(editable=False)

ваш ModelAdmin не будет показывать поле в издании, поле будет исключено.

...