Djangoレシピ。 パート1-AJAXフォーム

こんにちは、habrauser!



私はすでに中年の危機に見舞われたかもしれませんが、夏にはメジャーなオープンソースプロジェクトに取り組み始めました。 しかし、それについて少し後で、コードが恥ずかしくないとき 。 だから、DRY Do n't Repeat Youselfの概念に合わせて書く必要のあるスニペットをいくつか共有したいと思います。 したがって、私はいくつかの記事を書くつもりです。

ところで、あなたは私の以前の記事に注意を払うことができます。



AJAXの実装から始めます。



すぐに予約したい-少し前に ajaxフォームを実装するためのがdzhangi Webサイトで見つかりまし 。 判明したように、私はほとんど同じことをしましたが、自分でやったので満足しています=)以下に例を示して分析します。

画像



猫をお願いします。



リリース1.5のdjango.views.genericモジュールの外観を考慮して、Jungでのフォームの処理について話すと、FormViewクラスに注意を払うしかありません。 フォームを処理するための他のすべてのジェネリッククラスはそこから継承されるため、実験の対象として選択しました。



それでは、行きましょう:




バックエンド



is_valid(self、form)およびis_invalid(self、form)メソッドは、フォームがそれぞれis_valid()の要件を満たしている場合とそうでない場合に、返された結果を処理します。 FormMixinの祖先を作成すると、次のことがわかります。

def form_valid(self, form): """ If the form is valid, redirect to the supplied URL. """ return HttpResponseRedirect(self.get_success_url()) def form_invalid(self, form): """ If the form is invalid, re-render the context data with the data-filled form and errors. """ return self.render_to_response(self.get_context_data(form=form))
      
      







is_valid()メソッドの場合、リダイレクトだけが煩わしいです。 したがって、このコードを必要な答えに安全に置き換えることができます。

 from django.shortcuts import HttpResponse def form_valid(self, form): return HttpResponse('OK')
      
      





その結果、 jqueryが予期する出力でHTTP 200コードを取得します



また、 ModelFormMixinクラスを覗いて、応答の前にフォームの保存を追加することもできました。 その結果、次のようなハイブリッドを得ました。

  def form_valid(self, form): form.save() return HttpResponse('OK')
      
      







フォームエラーの場合の答えはやや複雑です-エラー辞書を返し、ユーザーに表示する必要があります。 ただし、タスクはフォームの標準属性エラーを使用して簡単に実行できます。

 import json from django.http import HttpResponseBadRequest def form_invalid(self, form): errors_dict = json.dumps(dict([(k, [e for e in v]) for k, v in form.errors.items()])) return HttpResponseBadRequest(json.dumps(errors_dict))
      
      







AjaxFormMixin



したがって、次のクラスを取得します。

 from django.views.generic import FormView class AjaxFormMixin(FormView): template_name = 'form_ajax.html' #         ,     =) ,   . def form_valid(self, form): form.save() return HttpResponse('OK') def form_invalid(self, form): errors_dict = json.dumps(dict([(k, [e for e in v]) for k, v in form.errors.items()])) return HttpResponseBadRequest(json.dumps(errors_dict))
      
      







これで、他のタイプのクラスベースビューと同様に、安全に継承できるクラスができました 。 呼び出しは次のようになります。

 from django.contrib.auth.forms import PasswordChangeForm #  -  ;-) class PasswordChange(AjaxFormMixin): form_class = PasswordChangeForm
      
      







CreateFormとして使用できるのは、親FormMixinクラスの__init __()メソッドがモデル引数を受け入れないため、この作業を自分で行う必要があるという警告がある場合のみです。

 from django.forms.models import modelform_factory class TaskUserAssign(AjaxFormMixin): form_class = modelform_factory(models.TaskRole)
      
      







AjaxUpdateFormMixin



したがって、ajaxフォームを処理するための基本クラスがあります。 django-wayに従って、アップデート用にもう1つの一般的な 「イメージ内」を作成してみてください。 同じdjango.views.genericモジュールUpdateViewクラスとその答えを見つけます。クラスのオブジェクト属性が必要です...

 class AjaxUpdateFormMixin(AjaxFormMixin, UpdateView): def get(self, request, *args, **kwargs): self.object = self.get_object() return super(AjaxFormMixin, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): self.object = self.get_object() return super(AjaxFormMixin, self).post(request, *args, **kwargs)
      
      





空想なしで、コードをコピーし、既存のAjaxFormMixinクラスから他のすべてを継承します。 ちなみに、このクラスにはUpdateViewから継承したモデル属性が既にあり、そのルートはModelFormMixinに戻ります



その結果、 法律で禁止されていない無料の継承のために、オブジェクトの作成、変更、および必要に応じて他のアクション(必要に応じてis_valid()/ dev / brainおよび/ dev / handsをオーバーライドをサポートする一連のクラスがあります。




PS。この記事の目的は、私の業績を示すことではなく(ここで何を分析できるか)、プロセス自体を分析することではありませんでした。 少し後に、私のアシスタントがアプリケーションマズルコードを完了すると、フロントエンドコンポーネントコードでも記事を補足します。 それまでの間、ご清聴ありがとうございました。



All Articles