Django表单字段验证-如何判断操作是插入还是更新?

Django表单字段验证-如何判断操作是插入还是更新?,django,django-models,django-forms,django-validation,Django,Django Models,Django Forms,Django Validation,我在Django尝试这样做: 在Admin中保存对象时,我希望根据First对象中的一个字段保存另一个不同类型的对象。 为了做到这一点,我必须检查第二个对象是否已经存在,如果存在,则只返回第一个对象中特定字段的验证错误。 我的问题是,仅当操作为insert时,我希望验证错误出现在字段中 如何在知道操作是更新还是插入的基础上显示特定管理表单字段的验证错误 另外,我知道对于模型验证来说这是不可能的,因为验证器只接受value参数,但我认为对于表单验证来说应该是可能的。您可以编写: 为模型创建模型表单

我在Django尝试这样做: 在Admin中保存对象时,我希望根据First对象中的一个字段保存另一个不同类型的对象。 为了做到这一点,我必须检查第二个对象是否已经存在,如果存在,则只返回第一个对象中特定字段的验证错误。 我的问题是,仅当操作为insert时,我希望验证错误出现在字段中

如何在知道操作是更新还是插入的基础上显示特定管理表单字段的验证错误

另外,我知道对于模型验证来说这是不可能的,因为验证器只接受value参数,但我认为对于表单验证来说应该是可能的。

您可以编写:


为模型创建模型表单。在
clean
方法中,可以为特定字段设置错误


有关更多信息,请参阅文档。

这可以通过在Django管理表单中编写一个干净的[name\u of\u field]方法来完成。可以通过测试self.instance.pk来检查插入或更新操作

class EntityAdminForm(forms.ModelForm):
    def clean_field(self):
        field = self.cleaned_data['field']
        insert = self.instance.pk == None
        if insert:
            raise forms.ValidationError('Some error message!')
        else:
            pass
        return field

class EntityAdmin(admin.ModelAdmin):
    form = EntityAdminForm
向Django管理员注册实体模型时,必须使用EntityAdmin类:

admin.site.register(Entity, EntityAdmin)
这(可能)不是一个确切的答案,但我想这可能会有所帮助

Django Admin允许您使用ModelAdmin.save_model method()覆盖
save
方法

Django api还有一个
get\u或\u create
方法()。它返回两个值,第一个是对象,第二个是表示是否创建了对象(更新了现有记录)的布尔值

假设您有
FirstObject
SecondObject

在相关的
admin.py
文件中:

class FirstObjectAdmin(admin.ModelAdmin):
...
...
    def save_model(self, request, obj, form, change):
        s_obj, s_created = SecondObject.objects.get_or_create(..., defaults={...})
        if not s_created:
            #  second object already exists... We will raise validation error for our first object
            ...
至于其他方面,我不清楚如何处理。因为您手头有表单对象,所以可以调用
form.fields{'somefield'].validate(value)
和。您可能会重写
clean
方法,并尝试从
ModelAdmin.save\u model
方法触发
raisevalidationerror
。您可以调用
validate
并从那里传递一个值


您可以挖掘django源代码,查看django如何处理此问题,并尝试定义一些自定义验证步骤。

是的,但验证错误是否仅出现在所需字段中?ops!抱歉:Model.clean()引发的任何ValidationError异常将存储在一个特殊的密钥错误字典中。密钥:NON_FIELD_ERRORS。我也有兴趣将验证绑定到一个字段。@albundy,按照此链接:。然后返回新闻!@albundy,查看答案示例代码,您可以通过
self.pk is None
avaluation知道它是插入还是udate。是的,我知道您可以这样做,但您如何知道在clean方法中,如果操作是update或insert?如果您知道可以这样做,那么为什么要问“如何显示特定管理表单字段的验证错误?”?Andrew已经告诉过你可以检查pk以查看对象是否已保存,所以我认为我不需要重复他。你只粘贴了我问题的一部分:)。你回答了第一部分,我做了第二部分;)我一直知道你检查pk。但没有pk。这是我的问题。我不知道在self.instance中有db entityI的实例我尝试了几个不同的选项,所以,这非常有效
class FirstObjectAdmin(admin.ModelAdmin):
...
...
    def save_model(self, request, obj, form, change):
        s_obj, s_created = SecondObject.objects.get_or_create(..., defaults={...})
        if not s_created:
            #  second object already exists... We will raise validation error for our first object
            ...