Django Admin禁用FK字段更新

2024-09-28 01:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是django1.9。在

我有一些模型:

class MyOtherModel:
    my_other_prop = models.IntergerField()

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

我的管理模式是:

^{pr2}$

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

我在Django文档上翻了一番,也在google上搜索了不少,但没有找到一种方法来实现这一点。我不希望字段是只读的,因为我希望能够创建它们。如果这个对象存在,我不想重写get_readonly_fields()返回false,因为我仍然希望能够更改MyOtherModelMyModel拥有的。。只是不要编辑MyOtherModel本身。在

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


Tags: 方法模型编辑modelmodelsmysomeclass
2条回答

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

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

如果我没弄错你的问题,这个行吗?在

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

相关问题 更多 >

    热门问题