2011-02-09 45 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

相关问题