2012-01-18 11 views
1

私は完璧主義の中で、それほどよく文書化されていないクラスベースのビューについてさらに質問しています。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のフォームのコピーを作成していますが、私はの父親がを取得して、誰かが空になるようなコピーを持っているので、テンプレートを表示すると、送信されたフォームが空であるため、 。

アイデア?ありがとう。

答えて

3

問題は、super(SearchFormView, self).get(request, *args, **kwargs)が独自のフォームと独自のコンテキストをレンダリングすることです。唯一の3行表示関数なので、実際にその動作を変更する必要があるものをオーバーライドする必要があります。

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 self.render_to_response(self.get_context_data(form=form)) 

更新:あなたはスーパーコール

def get(self, request, *args, **kwargs): 
    self.form = SearchForm(self.request.GET or None) 
    if self.form.is_valid(): 
     self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10] 

    return super(SearchFormView, self).get(request, *args, **kwargs) 


def get_form(self, form_class): 
    """ 
    Returns an instance of the form to be used in this view. 
    """ 
    return getattr(self, 'form', None) or form_class(**self.get_form_kwargs()) 
+0

FormViewを仲介しているので私のアイデアだったが、それは良くないと思う。フォームを検証するために空のフォームを表示するform_class属性がある。私の言うことを理解していますか? –

+1

FormViewがどのように壊れているかはわかりません.GETで検証し、POSTはいつものように進んでいきます。親の 'get'関数を本当に使いたいのであれば、self.formが存在すればself.formを返すように' form_class'をオーバーライドし、次にget関数でself.formを定義することができます。 –

+0

まあ、私は最初の選択肢を好む、もう1つはよりハッキーなものです。ありがとう。 –

0

を引き続き使用したい場合は、代替のアイデア問題があればDjangoのクラスベースのビューのみフォームkwargsからの移入という事実であるように思われますHTTPメソッドはPOSTまたはPUTです。

​​

これはちょっと特殊なことですGETリクエスト(例えば、。 "検索"フォーム)、いくつかの基本的な検証を実行する必要があった。このようなビューでget_form_kwargs()メソッドをオーバーライドして、HTTPメソッドがGETの場合でも、kwargs ['data']アイテムに値を設定します。

関連する問題