2011-02-23 3 views
5

나는 기록에 몇 가지 읽기 전용 필드 장고 관리 사이트를 사용하고 있습니다 : 기록을 편집 할 때이 위대한 작품을Django admin : 새 레코드에서 읽기 전용 필드를 숨기시겠습니까?

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 옵션이 있습니까? add_form.html에 CSS를 해킹 할 수 있다는 것을 알고 있지만, 더 좋은 방법은 없을까요?

감사합니다.

답변

0

또 다른 대안은 editable arg를 원래 모델에 설정하는 것입니다.

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

ModelAdmin에서 에디션 필드가 표시되지 않으면 해당 필드가 제외됩니다.

+0

필드를 편집 양식에서 읽기 전용으로 설정하고 제외하지 않으십시오. –

+0

편집 가능한보기가 아닌 추가보기입니다. – AP257

13

비슷한 문제가있었습니다. 이 문제를 해결했습니다.

class MyModelAdmin(admin.ModelAdmin): 
    readonly_fields = ('field_one',) 
    def get_readonly_fields(self, request, obj=None): 
     if obj: # Editing 
      return self.readonly_fields 
     return() 
1

약간 다른 해결책이 있는데도 비슷한 문제가있었습니다.

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 라인은 원래의 필드를 보여줍니다 : 나는 '새로운'양식에서 이미지 미리보기 (필드 만 읽기) ('추가'보기) 숨길 수 있지만, 새로운 객체를 가져올 때이를 표시하고 싶었다. 나는이 솔루션이 매우 건조한 것은 아니라고 인정하지만 명확하고 간단합니다. - 인라인 양식, 메인 OBJ 아닌 인라인 OBJ를 통과하고

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',)} 
     ), 
    ) 

참고 기본 폼이 유일한 작품 것을 :

3

여기 Kushal의 솔루션의 DRY 버전입니다.

관련 문제