Скрыть встроенную форму в Django - PullRequest
5 голосов
/ 03 мая 2011

Мой Django ModelAdmin показывает разные формы в зависимости от прав пользователя.Я решил это с помощью ModelForm (get_form, get_fieldsets), но что делать со строками?

class NewsAdmin(admin.ModelAdmin):
    form = NewsAdminForm
    writing_form = NewsWritingForm

    inlines = (LinkInline, FileInline)

ModelAdmin инициализирует их в ModelAdmin.__init__() перед получением объекта запроса.Кажется, единственный способ использовать CSS, чтобы скрыть их.

Ответы [ 4 ]

6 голосов
/ 24 апреля 2014

Вы можете использовать функцию ModelAdmin get_inline_instances. Следующий код удаляет inline из add_view:

from django.contrib import admin
from models import FooModel

class FooInline(admin.StackedInline):
    model = FooModel

class MyModelAdmin(admin.ModelAdmin):
    inlines = [FooInline]

    def get_inline_instances(self, request, obj=None):
        return obj and super(MyModelAdmin, self).get_inline_instances(request, obj) or []
1 голос
/ 28 февраля 2012

Я решил эту проблему, установив логику для установки self.inline_instances = [] в методе get_readonly_fields(self, request, obj=None).

Например, если вы хотите показать строчки суперпользователям, но не кому-либо еще:

def get_readonly_fields(self, request, obj=None):
    if request.user.is_superuser:
        return ()
    else:
        self.inline_instances = []
        return ()
1 голос
/ 03 мая 2011

ModelAdmin.__init__() принимает классы в ModelAdmin.inlines, создает их экземпляры и сохраняет результаты в ModelAdmin.inline_instances. Вы можете установить ModelAdmin.inline_instances в пустой список после __init__, чтобы удалить строки.

См. Строку 243 из django / contrib / admin / options.py

0 голосов
/ 14 декабря 2012

Я использовал трюк bskinner, чтобы скрыть строки при добавлении нового объекта, с двумя корректировками: во-первых, мне пришлось перезаписать «inlines», а не «inline_instances», и, во-вторых, убедиться, что вы всегда возвращаете self.readonly_fields, чтобы убедиться, чтоВы сохраняете их, когда они установлены.

def get_readonly_fields(self, request, obj=None):
    if obj: 
        # edit mode... add fields here to make them read-only when editing
        return self.readonly_fields
    else:
        self.inlines = []
        return self.readonly_fields
...