Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django管理-禁用FK字段的更新_Python_Django_Django Admin_Django 1.9 - Fatal编程技术网

Python Django管理-禁用FK字段的更新

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

我正在使用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\u other\u model
。我仍然希望能够设置它,并且仍然希望能够从
MyModelAdmin
创建一个。由于MyThermodel不通过admin任何其他位置公开,因此从admin部分的角度来看,模型是不可变的

我已经翻遍了Django文档,在谷歌上搜索了不少,但没有找到实现这一点的方法。我不希望字段是只读的,因为我希望能够创建它们。如果对象在本例中存在,我不想重写
get\u readonly\u fields()
以返回false,因为我仍然希望能够更改MyThermodel
MyModel
的属性。。只是不要编辑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覆盖,权限可以正常工作。或者只是潜在地覆盖该字段: