2010-08-21 33 views
6

是否有一個很好的方式定製項添加到子類ModelAdmin字段集,即讓它保留所有的默認值和只是一些額外的。django擴展ModelAdmin字段集並保持默認值

(我知道我可以添加所有默認回到我自己,但希望的是更好的方式)

回答

0

未經測試,但可能工作:

class MyAdmin(BaseAdmin): 
    fieldsets = BaseAdmin.fieldsets + (...) 

這(如果它的工作原理)添加繼承後的其他字段集。

+0

BaseAdmin.fieldsets在此處爲空。 – second 2010-08-21 12:31:42

10

您可以覆蓋get_fieldsets ModelAdmin的方法。

默認的實現看起來是這樣的:

def get_fieldsets(self, request, obj=None): 
    "Hook for specifying fieldsets for the add form." 
    if self.declared_fieldsets: 
     return self.declared_fieldsets 
    form = self.get_form(request, obj) 
    fields = form.base_fields.keys() + list(self.get_readonly_fields(request, obj)) 
    return [(None, {'fields': fields})] 

所以,你可以覆蓋它,例如像這樣:

class MyCustomAdmin(ModelAdmin): 
    def get_fieldsets(self, request, obj=None): 
     fs = super(MyCustomAdmin, self).get_fieldsets(request, obj) 
     # fs now contains [(None, {'fields': fields})], do with it whatever you want 
     all_fields = fs[0][1]['fields'] 
     return fs 
0

這裏是延伸自定義的ModelAdmin類,並增加額外的字段集的一個例子。

注意我第一次嘗試這個時,我忽略了「如果不是......」檢查。每次我刷新頁面時,頁面上都會重複額外的部分。

class GISDataFileAdmin(admin.ModelAdmin): 
    # abbreviated version of detailed fieldsets (one fieldset named 'Datafile Info') 
    fieldsets = [('DataFile Info', {\ 
       'fields': ('datafile_id', 'datafile_label', 'datafile_version')\ 
       }),] 

class ShapefileSetAdmin(GISDataFileAdmin):  

    # extend fieldsets in GISDataFileAdmin 
    def get_fieldsets(self, request, obj=None): 

     # get fieldset(s) from GISDataFileAdmin 
     # 
     fs = super(ShapefileSetAdmin, self).get_fieldsets(request, obj) 

     # pull out the fieldset name(s) e.g. [ 'DataFile Info'] 
     # 
     section_names = [ x[0] for x in fs if x is not None and len(x) > 0 and not x[0] == ''] 

     # check if new fieldset info has been added 
     # if not, add the new fieldset 
     # 
     if not 'Shapefile Info' in sections_names: 
      # Add new info as the top fieldset 
      fs = [ ('Shapefile Info', { 
       'fields': ('name', ('zipfile_checked', 'has_shapefile')) 
        })] + fs 
     return fs