6

私はDjangoでこれを行おうとしています:Adminでオブジェクトを保存するときに、最初のオブジェクトのフィールドの1つに基づいて別のタイプの別のオブジェクトも保存したいと思います。これを行うには、その2番目のオブジェクトがすでに存在するかどうかを確認し、存在する場合は最初のオブジェクトの特定のフィールドに対してのみ検証エラーを返す必要があります。私の問題は、操作が挿入である場合にのみ検証エラーをフィールドに表示したいということです。

操作が更新か挿入かを知ることに基づいて、特定の管理フォームフィールドの検証エラーを表示するにはどうすればよいですか?

PSバリデーターは値パラメーターのみを受け取るため、モデル検証ではこれは不可能であることを私は知っていますが、フォーム検証では可能であるはずです。

4

4 に答える 4

13

これは、Django 管理フォームに clean_[name_of_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

Entity モデルを Django 管理者に登録するときは、EntityAdmin クラスを使用する必要があります。

admin.site.register(Entity, EntityAdmin)
于 2012-10-03T12:52:52.500 に答える
0

モデル レベルでカスタム検証を記述できます。

#inside your class model ...
def clean(self):
    is_insert = self.pk is None
    from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
    #do your business rules
    if is_insert:
        ...
        if __some_condition__ :
            raise ValidationError('Dups.')
于 2012-10-03T11:56:48.197 に答える
0

モデルのモデル フォームを作成します。メソッドではclean、特定のフィールドにエラーを設定できます。

詳細については、相互に依存するフィールドのクリーニングと検証に関するドキュメントを参照してください。

于 2012-10-03T12:26:25.173 に答える
0

それは(おそらく)正確な答えではありませんが、役立つと思います。

Django Admin ではsave、ModelAdmin.save_model メソッドでメソッドをオーバーライドできます (ドキュメントはこちら) 。

また、Django api にはget_or_createメソッドがあります ( Doc is here )。2 つの値を返します。1 つ目はオブジェクトで、2 つ目はオブジェクトが作成されたかどうか (既存のレコードを更新したかどうか) を表すブール値です。

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
            ...

残りについては、それを処理する方法について明確な考えがありません。フォーム オブジェクトが手元にあるので、 admin のカスタム検証をform.fields{'somefield'].validate(value)呼び出して書き込むことができます。メソッドをオーバーライドして、 fromメソッドをトリガーしようとする可能性があります。そこから値を呼び出して渡すことができます...cleanraise ValidationErrorModelAdmin.save_modelvalidate

django のソースを掘り下げて、django がこれをどのように処理するかを確認し、いくつかのカスタム検証ステップを定義してみてください。

于 2012-10-03T15:22:24.057 に答える