2011-02-09 41 views
0

我有如下的情景:如何在編輯頁面上使字段不可修改,但可以在添加頁面上創建?

在我的models.py

class Room(models.Model): 
    pop = models.ForeignKey('Pop', verbose_name="POP", 
          help_text="Pop this room belongs to", null=True, 
          blank=True) 
    .... other fields .... 

class Pop(models.Model): 
    .... fields .... 

在我的admin.py

class RoomAdmin(admin.ModelAdmin): 
    search_fields = [..some fields...] 
    list_diplay = (pop, ....) 
    ..... other configuration ..... 

由於房與流行音樂外鍵關係,有可能將多個房間與一個Pop關聯。我必須執行這樣的事情。

  1. 當用戶從django管理頁面點擊「添加彈出」鏈接時,應該允許用戶將多個房間對象關聯到一個彈出對象。但是,一旦Room對象與Pop相關聯,它既不能被編輯,也不能與編輯屏幕上的另一個Pop相關聯。是否有可能實現這一目標?

我有這些可能的解決辦法,但我不知道如何實現在Django這些想法或者,如果這些想法是可行的:

  1. CSS魔法。我可以將CSS ID關聯到彈出字段,以便只能對編輯屏幕啓用它。我不知道如何實現這一點Django的admin.py,如果我可以從編輯屏幕排除彈出域,那麼它可能會工作。

  2. 修改模板以便它們可以支持不可編輯的字段。

回答

1

選項2是最好的。您可以在RoomAdmin類重寫get_form方法排除pop場當有物體編輯:

def get_form(self, request, obj=None, **kwargs): 
    # if there's an object and it has been previously saved 
    if obj is not None and obj.id is not None: 
     # add 'pop' to the list of fields to exclude 
     exclude = list(kwargs.get('exclude', [])) 
     exclude.append('pop') 
     kwargs['exclude'] = exclude 
    return super(RoomAdmin, self).get_form(request, obj, kwargs) 
+0

這是不是隱藏表單頁面上的場?我不想隱藏Pop管理頁面上的Room字段。我想禁用該字段的編輯。 – Kartik 2011-02-11 22:26:19

相關問題