2011-05-03 1 views
3

Django ModelAdmin은 사용자 권한에 따라 다른 형태를 보여줍니다. ModelForm (get_form, get_fieldsets)으로 해결했지만 인라인은 어떻게해야할까요?Django의 인라인 양식 숨기기

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

    inlines = (LinkInline, FileInline) 

ModelAdmin은 요청 개체를 얻기 전에 ModelAdmin.__init__()에 초기화합니다. 유일한 방법은 그들을 숨기기 위해 CSS를 사용하는 것 같습니다.

답변

1

ModelAdmin.__init__()ModelAdmin.inlines의 클래스를 가져 와서 인스턴스화하고 결과를 ModelAdmin.inline_instances에 저장합니다. __init__ 뒤에 ModelAdmin.inline_instances을 빈 목록으로 설정하여 인라인을 제거 할 수 있습니다. django/contrib/admin/options.py

+0

나는'컨텍스트를 설정하려고했습니다 [ 'inline_instances는'] = []'render_change_form''에 있지만 유효성 검사 오류를 발생시킵니다. (Django 1.3). 나는'self.inline_instances = []'를 비워 두려고 노력할 것이다 – San4ez

+0

흠 .. 나는 CSS를 사용하는 것이 더 쉬울 것이라고 생각한다. 귀하의 변형에서 인라인 인스턴스를 다시 시작하고 컨텍스트 개체에 추가해야합니다. django 소스 코드 – San4ez

+0

'render_change_form'의 많은 작업과 복사 - 붙여 넣기는 이런 유형의 로직에 대한 좋지 않은 선택처럼 보입니다. 'change_view'와 같이 사용자 권한을 확인하고'self.inline_instances'를 적절히 설정하면 아무런 문제가 없어야합니다. –

1

참조 라인 243 나는 get_readonly_fields(self, request, obj=None) 방법에 self.inline_instances = []을 설정하는 로직을 넣어이 문제를 해결했다. 이 조정으로, 새로운 객체를 추가 할 때 내가 인라인을 숨길 bskinner의 트릭을 사용

def get_readonly_fields(self, request, obj=None): 
    if request.user.is_superuser: 
     return() 
    else: 
     self.inline_instances = [] 
     return() 
0

: 다른 사람에

당신이 슈퍼 유저에 인라인을 보여주고 싶었다 예를 들어

있지만 첫째,했다 inline_instances "가 아닌"inlines "를 덮어 쓰고, 둘째로, 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 
4

ModelAdmin get_inline_instances 기능을 사용할 수 있습니다. 다음 코드는 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 [] 
+0

모든 인라인 제거하려면이 사용됩니다. 그런 다음 인라인을 제거하고 싶었으므로 처음 3 개의 인라인을 얻으려면'return super (MyModelAdmin, self) .get_inline_instances (request, obj) [0 : 3] '을 사용했습니다. 다른 부분 집합을 얻기 위해 다른 목록 조작을 사용할 수 있습니다. 누군가가 덜 해킹 해킹 해킹 방법으로 이것을하는 법을 말해 줄 수 있다면 나는 그것을 고맙게 생각할 것입니다! – jenniwren