gpt4 book ai didi

Django Admin - save_model 方法 - 如何检测字段是否已更改?

转载 作者:行者123 更新时间:2023-11-28 19:36:30 59 4
gpt4 key购买 nike

我正在尝试覆盖 save_model method on a Django admin object以防止用户更改某个字段。但是,我找不到一种方法来查明该字段是否已在此方法中更改。

到目前为止,这是我的代码:

def save_model(self, request, obj, form, change):
if change:
if obj.parking_location == form.cleaned_data['parking_location']:
super(MyVehiclesAdmin, self).save_model(request, obj, form, change)
else:
messages.error(request,
"The Parking Location field cannot be changed.")

问题是 obj.parking_location 和 form.cleaned_data['parking_location'] 都有新值。 (这可能是 Django 中的错误吗?看起来 obj 应该包含预保存值)。无论如何,还有其他方法可以做到这一点吗?

(我在 Django 1.2 上)

最佳答案

首先,这不是错误,这是 Django 1.2 及更高版本中记录的行为。

来自Django 1.2 release notes :

the first time you call ModelForm.is_valid(), access ModelForm.errors or otherwise trigger form validation, your model will be cleaned in-place. This conversion used to happen when the model was saved. If you need an unmodified instance of your model, you should pass a copy to the ModelForm constructor.

如果您想阻止用户编辑特定字段,更好的方法可能是使用 ModelAdmin.readonly_fields选项。

class VehicleRegistrationAdmin(admin.ModelAdmin):
readonly_fields = ('parking_location',)

或者,您可以将 ModelAdmin.form 替换为排除该字段的自定义表单。

class VehicleRegistrationForm(forms.ModelForm):
class Meta:
exclude = ('parking_location',)

class VehicleRegistrationAdmin(admin.ModelAdmin):
form = VehicleRegistrationForm

最后,为了更直接地回答您的问题,您可以通过检查 form.changed_data 来检查 save_model 方法中的字段是否已更改。这是已更改字段名称的列表。

def save_model(self, request, obj, form, change):
if 'parking_location' in form.changed_data:
messages.info(request, "Parking location has changed")
else:
messages.info(request, "Parking location has not changed")
super(MyVehiclesAdmin, self).save_model(request, obj, form, change)

关于Django Admin - save_model 方法 - 如何检测字段是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056179/

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