私は完璧主義の中で、それほどよく文書化されていないクラスベースのビューについてさらに質問しています。getリクエストでフォームを検証する方法は?
私はクラスベースのビューについて学習するのに5時間を費やし、コードに潜んでいます。質問があります。
もし私がしようとしているのは、愚かなことかもしれません。
私は簡単な例を配置します:
class SearchFormView(FormView):
template_name = 'search/search.html'
form_class = SearchForm
def get(self, request, *args, **kwargs):
form = SearchForm(self.request.GET or None)
if form.is_valid():
self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10]
return super(SearchFormView, self).get(request, *args, **kwargs)
は、これは(?それは、右)完璧有効なクラスです。
フォームがあり、クエリパラメータを使用してGETリクエストを行います。
魅力的な作品です。
しかし、私はいくつかのタイプの攻撃を防ぐためにクエリの入力を検証して、そのクエリが悪意のあるため、検証エラーを表示します。
古い関数では、フォームインスタンス(空)があり、必要に応じてデータとその中にデータを入れます。私は空の場合(最初のリクエスト)、またはエラーでいっぱいになった場合(悪意のあるクエリの場合)、常にそのインスタンスを返します。
問題はクラスベースのビューです。私のgetメソッドでは、SearchFormの追加インスタンスを使用していますので、検証用のものを入れたら、を父親に置くと、空である "form_class"のインスタンスが使用されます。
私はいつも同じフォームを使用する方法があるべきだと思います。私はリクエストメソッドを呼び出し、form_class(新しいフォームを作成しない)を選択し、データを渡し、検証します。父親はそのフォームを検証用のものと一緒に返すでしょう。
これを正しく説明してもわかりません。つまり、私はgetのフォームのコピーを作成していますが、私はの父親がを取得して、誰かが空になるようなコピーを持っているので、テンプレートを表示すると、送信されたフォームが空であるため、 。
アイデア?ありがとう。
FormViewを仲介しているので私のアイデアだったが、それは良くないと思う。フォームを検証するために空のフォームを表示するform_class属性がある。私の言うことを理解していますか? –
FormViewがどのように壊れているかはわかりません.GETで検証し、POSTはいつものように進んでいきます。親の 'get'関数を本当に使いたいのであれば、self.formが存在すればself.formを返すように' form_class'をオーバーライドし、次にget関数でself.formを定義することができます。 –
まあ、私は最初の選択肢を好む、もう1つはよりハッキーなものです。ありがとう。 –