2012-08-29 2 views
1

의 특정 멤버에서 하나 개의 필드를 제거하는 방법 :장고 : 나는 표 인라인과 장고 관리자에서 폼을 가지고있는 관리자 인라인

class MemberAdminInline(admin.TabularInline): 
    model = Member 
    fields = ("first_name", "last_name") 
    readonly_fields = ("first_name",) 

class GroupAdmin(admin.ModelAdmin): 
    model = Group 
    fields = ("name", "description") 
    inlines = [MemberAdminInline] 

나는 회원의 last_name 조건을 표시하고 싶습니다. 나는.

"If first_name = "Joe": don't display show field for last_name". 

그것 정말 필드를 표시하지하고 있기 때문에 어떤 경우에는 내 실제 작업 시나리오에서, (예를 들어, JS를 사용)이 필드가 통과 할 때 breaked됩니다 이진 데이터를 포함 할 수 있습니다 숨기지에 중요 형태. 즉, last_name은 특정 first_name에 대해서만 관리자를 통해 편집 가능하게하고 싶습니다.

인라인에 대한 사용자 지정 양식을 제공하고 거기에서 조건부로 필드를 제거하려했거나 다양한 단계에서 readonly_fields의 목록에 동적으로 필드를 포함시키지 만 장고는 항상 필드를 숨기려고하는 필드를 찾으려고했습니다. 그것은 장고처럼 보인다

장고 1.3.1

답변

1

인라인 작성시 해당 formset에 대한 필드의 목록을 계산 한 후 해당 formset이 존재하는이 필드를 주장한다.

class MemberAdminInlineForm(forms.ModelForm): 
    def clean_last_name(self): 
     if hasattr(self, "instance"): 
      if self.instance.first_name == "Joe": 
       return self.instance.last_name 
     return self.cleaned_data["last_name"]. 

class MemberAdminInline(admin.TabularInline): 
    model = Member 
    fields = ("first_name", "last_name") 
    readonly_fields = ("first_name",) 
    form = MemberAdminInlineForm 
+0

그것은 충분히 문자가 아니기 때문에 내가 그것을 해결하지 않습니다하지만 당신은했습니다 : 필요할 때 내가 찾은이 문제를 극복하기 위해 그래서 유일한 방법

실제로 저장된 값을 무시하는 것입니다 MemberAdminInlineForm에 사소한 오타가있어 코드에없는 경우 걱정하지 않아도됩니다. 'if self.intance.first_name == "Joe":'이어야합니다'if self.instance.first_name == "Joe": – chucksmash

+0

수정 됨. 감사합니다. –