1

私はDjangoとクラスベースのフォームにかなり慣れていませんが、これらが互いにどのように相互作用するかを理解するのに苦労しています。djangoプロジェクトの例に続いて、プロジェクトのすべてのページに配置される「検索フォーム」を作成しようとしました。

# forms.py
from django import forms

class SearchForm(forms.Form):
    myquery = forms.CharField(max_length=255,label="", help_text="sq")

    def __unicode__(self):
        return self.myquery

# views.py
from searchapp.forms import SearchForm
from django.views.generic.edit import FormView
from django.views.generic import TemplateView

class SearchView(FormView):
    template_name = 'index.html'
    form_class = SearchForm
    success_url = '/searchres/'

    def form_valid(self, form):
        thequery=form.cleaned_data.get('myquery')
        return super(SearchView, self).form_valid(form)

    class Meta:
        abstract = True

class SearchResView(SearchView):
    template_name = 'searchres.html'


#urls.py
from django.conf.urls import patterns, include, url
from django.conf import settings
from deals.views import IndexView
from searchapp.views import SearchView, SearchResView

urlpatterns = patterns('',
    url(r'^index/', SearchView.as_view(),name="home"),
    url(r'^searchres/', SearchResView.as_view(),name="searchresx"),
)

計画は、ユーザーが検索クエリを入力するための簡単なフォームから開始し、結果ページに入力フォームを表示することから始まります。ここに次の質問があります(申し訳ありませんが、私はクラスベースのビューのDjango初心者です):

  • どのようにしてデータ( "thequery")をsuccess_urlに渡しますか?つまり、success_urlに「thequery」へのアクセス権を持たせて、テンプレートタグで{{thequery}}のようなものを使用できるようにします。
  • form(name = "home")を送信すると、firebugのフォームからPOSTデータが表示されますが、「thequery」ではなく「myquery」だけが表示されます。ここでget_context_data()を使用して、「thequery」変数も追加/投稿するにはどうすればよいですか?
  • 最後に、「thequery」文字列に基づいてsuccess_urlを構築できるかどうか疑問に思いました。つまり、success_url ='/ searchres /?q='+thequeryのようなものです。

よろしくお願いします。もっと知りたいです。

4

1 に答える 1

1

これには関数ベースのビューを使用することをお勧めします。ジェネリックビューをサブクラス化することを選択した場合は、オーバーライドする適切なメソッドを見つけるために、多くのドキュメントと場合によってはソースコードを掘り下げる必要があります。(本当に熱心な場合は、、、およびメソッドと一緒ListViewにクラスを見てください)get_queryset()get()post()

通常、単一のdjangoビューは、空のフォームのレンダリングと送信されたフォームの処理の両方を処理します。

したがって、検索ページ(フォームと結果の両方)はhttp://your-site.com/searchにあります。あなたのURL設定は-

urlpatterns = patterns('',
    #...
    (r'^search/$', 'searchapp.views.search'),
)

そして、あなたの見解は次のようになります-

def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            my_query = form.cleaned_data['myquery']
            object_list = YourModel.objects.filter(# some operation involving my_query)
            return render_to_response('search_results.html', {'object_list': object_list})
     else:
        form = SearchForm()
     render_to_response('search_form.html', {'form': form})

(フォームメソッドはgetではなくpostであると想定していることに注意してください。これは優れたhttpではないことはわかっていますが、djangoでは一般的なパターンです)

あなたの質問に答えるために-

  1. データのクリーニングに独自の方法を使用しないでください。clean_myqueryメソッドをフォームに追加し、でアクセスしますform.fields['myquery'].clean()(またはis_valid()、フォームを呼び出した場合は、でアクセスできますform.cleaned_data['myquery'])。

処理するデータをテンプレートに渡さないようにします。ビューで可能な限り多くの処理を行ってから、テンプレートをレンダリングします。render_to_responseただし、テンプレートがレンダリングする文字列としてmyqueryを渡したい場合は、それをコンテキストディクショナリ(2番目の非キーワード引数)に追加します。

return render_to_response('search.html', {'object_list': object_list, 'myquery': my query})
  1. 投稿データはフォームフィールドから作成されます。フォームフィールドがありませんthequery。ビューはPOSTデータを処理しています-htmlによって行われるデータを作成していません(HTMLはFormクラスによって構築されます)。変数thequeryはビューで宣言されています。

  2. DjangoのURLディスパッチャーは、URL内のクエリ文字列を無視するため、http : //your_site.com/ssearchはhttp://your_site.com/search?myquery=findstuffと同じビューで処理されます。テンプレートのhtmlをからに変更し、 。を使用してdjangoのデータにアクセスするだけです。(フォームの送信を処理しているのか、空白のフォームをレンダリングしているだけなのかを確認するための新しいチェックを含めるために、上記のビューからコードを変更する必要があります)<form method='post'>request.GET

ビューフォーム、およびURLディスパッチャーに関するドキュメントをよく読んでください。

于 2013-02-12T15:37:55.147 に答える