Python Django管理-禁用FK字段的更新
我正在使用Django 1.9 我有一些模型:Python Django管理-禁用FK字段的更新,python,django,django-admin,django-1.9,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 = My
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\u other\u model
。我仍然希望能够设置它,并且仍然希望能够从MyModelAdmin
创建一个。由于MyThermodel不通过admin任何其他位置公开,因此从admin部分的角度来看,模型是不可变的
我已经翻遍了Django文档,在谷歌上搜索了不少,但没有找到实现这一点的方法。我不希望字段是只读的,因为我希望能够创建它们。如果对象在本例中存在,我不想重写get\u readonly\u fields()
以返回false,因为我仍然希望能够更改MyThermodelMyModel
的属性。。只是不要编辑MyThermodel本身
有人能给我指一下正确的方向吗?我应该使用不同的方法吗?任何建议都将不胜感激,谢谢 如果我正确理解你的问题,这行得通吗
您可以覆盖admin类中的
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
表单,该表单不包括字段。尝试创建新实例时,将使用不排除的标准表单(即所有模型字段)。如果希望字段显示为只读,可以通过init进一步调整ReadOnlyPkForm
(我刚才使用了exclude
,以简化示例)
注意:管理类也有
change\u view()
和add\u view()
方法,您也可以使用这些方法来覆盖编辑/创建页面中的表单,但根据我的经验,它们用于更复杂的修改(例如,underyling模板),更不用说这两种方法可能由于缓存问题而具有奇怪的行为。Paul,谢谢你的回复。不,当在列表视图中时,这不适用于链接上的字段。我试图在编辑/创建模式下执行此操作。如果查看管理代码中的第160行和formfield覆盖,权限可以正常工作。或者只是潜在地覆盖该字段: