2017-10-13 11 views
0

私はDjangoのフォームを使用してAPI PATCH要求を検証しています。 "ビュー"(実際に直接ビューではないので引用符で囲みますが、これは落ち着きのないResourceですが、ここでは無関係です)、このパッチ要求を処理するself.dataには、 Licenseオブジェクトのフィールド。変更するオブジェクトのインスタンスにModelFormをインスタンス化したいと思います。明らかに、しかし、私はこれがどう機能するのか誤解しています。下記を参照してください:私は上記の機能にデータとしていくつかのフィールドを渡すと、form.errorsModelForm作品でインスタンスを設定する方法を、私ははっきりと理解していないよという意味、Licenseモデルのほぼすべての他の必要なフィールドを文句Django ModelForm 'instance' paramが期待通りに動作しない

def handle_patch(self, pk): 
    license = License.objects.get(id=pk) 

    form = LicenseResourceForm(self.data, instance=license) 

    if not form.is_valid(): 
     print(form.errors) 

私はclean()方法でDjangoのModelFormコード自体にいくつかのデバッグプリントを追加し、それが洗浄工程を行うことを始めると、私はself.instanceが私を混乱させる、私は期待しLicenseのインスタンス、移入されていることがわかります - ModelFormオブジェクトはインスタンスを認識していますが、それを「空白を埋める」ために使用していません。

私は何を誤解していますか?私はこれを間違っていなければならない。

EDIT私はここに、それは私のデバッグ出力を含む、である、あなたのいくつかはLicenseResourceFormそのものを見てみたいことを実現:

class LicenseResourceForm(ModelForm): 
    """Form for License Resource create and change endpoints.""" 
    class Meta(object): 
     model = License 
     fields = ['customer', 'service', 'enabled', 'not_valid_before', 'not_valid_after'] 

    def clean(self): 
     try: 
      print(self.instance) 
      super().clean() 
     except Exception as e: 
      print(e) 

答えて

1

Djangoのフォームは、APIの使用とドン」のためのものではありませんPATCHの意味を理解する。これらは、ユーザーがWebフォームでデータを入力または変更する際のワークフローを意味し、常にすべてのデータをバックエンドに送信します。したがって、フォームのfields属性にリストされているすべてのフィールドがデータと照合され、不足しているフィールドは空白として検証されます。

これは、提供されたデータに基づいてフィールドのリストを動的に設定するために賢明なやり方で行うことができますが、実際にはデータの検証に適切なツールを使用する必要があります。私は不穏を知らないが、django-rest-frameworkにはこれに使用できるシリアライザがある。

+0

HTMLフォームのコンテキストで考えてみましょう。また、部分フォームを送信しないという事実は理にかなっています。フィールドの動的設定に関する良いアイデア。私はそれと一緒に遊ぶよ。ありがとうございました! – fildred13

関連する問題