gpt4 book ai didi

python - Django Admin - 禁用 FK 字段更新

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:15 24 4
gpt4 key购买 nike

我使用的是 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() 以返回 false,因为我仍然希望能够更改哪个 MyOtherModel MyModel 有..只是不编辑 MyOtherModel 本身。

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

最佳答案

您可以重写管理类中的 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_view()add_view() 方法,您也可以使用它们来覆盖编辑/创建页面中的表单,但根据我的经验,它们用于更复杂的修改(例如底层模板),更不用说这两种方法可能由于缓存问题而具有奇怪的行为。

关于python - Django Admin - 禁用 FK 字段更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35582871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com