Django Admin - 禁用FK字段的更新

时间:2016-02-23 16:28:50

标签: python django django-admin django-1.9

我正在使用Django 1.9。

我有一些模特:

class MyOtherModel:
    my_other_prop = models.IntergerField()

class MyModel:
    some_prop = models.IntegerField()
    my_other_model = models.ForeignKey(MyOtherModel)

我的管理模式是:

class MyModelAdmin(ModelAdmin):
    model = MyModel
    fields = ['some_prop', 'my_other_model']

现在默认情况下,我可以在表单上设置my_other_model,创建my_other_model和更新my_other_model。我想要做的是禁用编辑(更新)my_other_model。我仍然希望能够设置它并仍然希望能够从MyModelAdmin创建一个。由于MyOtherModel未通过管理员在任何其他地方公开,因此从管理部分的角度来看,模型是不可变的。

我已经在Django文档周围进行了挖掘并且谷歌搜索了很多但是没有找到实现这一目标的方法。我不希望该字段是只读的,因为我希望能够创建它们。如果在这种情况下对象存在,我认为我不想覆盖get_readonly_fields()以返回false,因为我仍然希望能够更改MyOtherModel MyModel具有的内容。只是不要编辑MyOtherModel本身。

有人能指出我在正确的方向吗?我应该使用不同的方法吗?非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

您可以覆盖管理类中的get_form()方法,以便在编辑和修改中使用其他表单。创建页面:

class ReadOnlyPkForm(ModelForm):
    class Meta:
        model = MyModel
        exclude = ('myothermodel',)



class MyModelAdmin(ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if obj: # Object intstance, so we're in edit page
            # Override form, to use custom form 
            kwargs['form'] = ReadOnlyPkForm
        return super(MyModelAdmin, self).get_form(request, obj, **kwargs)

当您尝试编辑实例时,上一个代码段将使用自定义ReadOnlyPkForm表单(排除字段)。当您尝试创建新实例时,将使用不排除的标准表单(即所有模型字段)。如果您希望字段显示为只读(我只是使用ReadOnlyPkForm来简化示例),您可以通过 init 进一步调整exclude

注意管理类还有change_view()add_view()方法,您也可以使用这些方法覆盖编辑/创建页面中的表单,但根据我的经验,它们用于更复杂的修改(例如底层模板) )更不用说这两种方法由于缓存问题可能会有奇怪的行为。

答案 1 :(得分:0)

如果我理解你的问题,这会有效吗?

<强> Disable link to edit object in django's admin (display list only)?