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 模板)更不用说这两种方法可能会由于缓存问题而产生古怪的行为。
我正在使用 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 模板)更不用说这两种方法可能会由于缓存问题而产生古怪的行为。