2011-02-23 66 views
5

我使用記錄的Django管理站點與一些只讀域: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

他希望字段在編輯表單上是隻讀的,但不能完全排除它。 – 2011-02-23 15:34:42

+0

這是我關心的添加視圖,而不是可編輯的視圖。 – AP257 2011-02-25 09:40:52

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線示出了原始的字段。我承認這個解決方案不是非常「幹」,但它很簡單明瞭。

3

這裏的Kushal的解決方案的幹版:

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

注意,主窗體上這僅適用 - 內聯表格,你通過了主要OBJ,而不是內聯OBJ。