2008-10-15 9 views
2

我想創建一個模型,它將在創建時設置editable = False,並在編輯項目時設置爲editable = True。我認爲它應該是這樣的:變量作爲字段選項中的參數

home = models.ForeignKey(Team, editable=lambda self: True if self.id else False) 

但它不起作用。也許重寫init可以幫助我,但我不知道什麼可以做的伎倆。我知道我可以在save()方法中檢查self.id,但是太晚了,我想在填充字段時在管理應用程序中使用這種邏輯。

回答

4

添加以下(小擴展this code)到您的admin.py:

from django import forms 

class ReadOnlyWidget(forms.Widget): 
    def __init__(self, original_value, display_value): 
     self.original_value = original_value 
     self.display_value = display_value 

     super(ReadOnlyWidget, self).__init__() 

    def render(self, name, value, attrs=None): 
     if self.display_value is not None: 
      return unicode(self.display_value) 
     return unicode(self.original_value) 

    def value_from_datadict(self, data, files, name): 
     return self.original_value 

class ReadOnlyAdminFields(object): 
    def get_form(self, request, obj=None): 
     form = super(ReadOnlyAdminFields, self).get_form(request, obj) 
     fields = getattr(self, 'readonly', []) 
     if obj is not None: 
      fields += getattr(self, 'readonly_on_edit', []) 

     for field_name in fields: 
      if field_name in form.base_fields: 
       if hasattr(obj, 'get_%s_display' % field_name): 
        display_value = getattr(obj, 'get_%s_display' % field_name)() 
       else: 
        display_value = None 

       form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value) 
       form.base_fields[field_name].required = False 

     return form 

然後,您可以指定某些領域應該由只讀當對象被編輯:

class PersonAdmin(ReadOnlyAdminFields, admin.ModelAdmin): 
    readonly_on_edit = ('home',) 

admin.site.register(Person, PersonAdmin)