Django Admin - 禁用 FK 字段的更新

Django Admin - Disable Update For FK Fields

我正在使用 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 文档并用 Google 搜索了很多,但没有找到实现此目的的方法。我不希望该字段是只读的,因为我希望能够创建它们。如果在这种情况下对象存在,我认为我不想将 get_readonly_fields() 覆盖为 return false,因为我仍然希望能够更改 MyOtherModel MyModel 具有的对象.. 只是不编辑 MyOtherModel 本身。

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

如果我对你的问题的理解正确,这行得通吗?

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

您可以覆盖管理中的 get_form() 方法 class 以在编辑和创建页面中使用不同的表单:

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 表单——它不包括该字段。当您尝试创建新实例时,将使用不排除的标准表单(即所有模型字段)。如果您希望该字段显示为只读,您可以通过 init 进一步调整 ReadOnlyPkForm(我只是使用 exclude 使示例更容易)。

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