如何在编辑页面上使字段不可修改但能够在添加页面上创建?

时间:2011-02-09 22:50:30

标签: python django django-admin

我的情况如下:

在我的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 .....

由于Room与Pop具有外键关系,因此可以将多个房间与一个Pop关联。我必须实现类似的东西。

  1. 当用户点击django管理页面中的“添加弹出”链接时,应允许用户将多个Room对象关联到Pop对象。但是,一旦Room对象与Pop关联,它既不能编辑也不能与编辑屏幕中的另一个Pop关联。是否有可能实现这一目标?
  2. 我有这些可能的解决方案,但我不知道如何在Django中实现这些想法,或者这些想法是否可行:

    1. CSS魔术。我可以将CSS id与pop字段关联,以便只能为编辑屏幕启用它。我不确定如何实现这个

    2. Django的admin.py,如果我可以从编辑屏幕中排除pop字段,那么它可能会有用。

    3. 修改模板,以便它们可以支持不可编辑的字段。

1 个答案:

答案 0 :(得分:1)

选项2是最好的。您可以覆盖get_form类中的RoomAdmin方法,以便在有要编辑的对象时排除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)