4

編集:
「success_url」(つまり、result.html) に「form.process()」からの「データ」を表示する必要があります。次のコードは明らかに機能しません。誰でも何が問題なのか教えてください。または、基本的にテンプレートでコンテキスト「データ」を表示する別の方法を提案できますか (リストまたは辞書の形式で)。つまり、フォームが作成された後にユーザーにデータを表示するより良い方法です。提出した。
よろしくお願いします。

-- urls.py --
url(r'^$', view='main_view'),
url(r'^result/$', view='result_view'),

-- views.py --
class ResultView(TemplateView):
    template_name = "result.html"

class MainView(FormView):
    template_name = 'index.html'
    form_class = UserInputForm
    success_url = 'result/'

    def form_valid(self, form):
        data = form.process()
        return super(MainView, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(MainView, self).get_context_data(**kwargs)
        context['data'] = data
        return context

main_view = MainView.as_view()
result_view = ResultView.as_view()
4

4 に答える 4

10

私があなたの質問を理解している限り、ユーザーが送信したフォームの内容を結果ビューに表示したいと考えています。あれは正しいですか?

この場合、メソッド get_context_data は、MainView にある現在のコンテキストにのみデータを格納するため、まったく役に立ちません。

FormView の form_valid メソッドは、success_url への HttpResponseRedirect を作成します。ここでの問題は、このビューにデータをどのように渡すことができるかということです。

Django return redirect() with parametersで説明されているように、最も簡単な方法はデータをセッションに入れることです。Djangoで説明されているように、result.html-template でこのデータにアクセスできます: テンプレート内からセッション変数にアクセスしますか?

コードは次のとおりです。

class ResultView(TemplateView):
    template_name = "result.html"

class MainView(FormView):
    template_name = 'index.html'
    form_class = UserInputForm
    success_url = 'result/'

    def form_valid(self, form):
        self.request.session['temp_data'] = form.cleaned_data
        return super(MainView, self).form_valid(form)

result.html テンプレートでは、この temp_data にアクセスできます。

{{ request.session.temp_data }}
于 2012-10-10T09:53:33.520 に答える
1

上で提案したように、オーバーライドできますget_context_data

たとえば、次のようなことができます。

def get_context_data(self, **kwargs):
    context = super(MainView, self).get_context_data(**kwargs)
    #set some more context below.
    context['foo'] = bar
    ...
    return context
于 2012-10-03T22:27:56.527 に答える
0

あなたの問題になる可能性のあることがいくつかあります。まず、form_valid()メソッドで、そのクラスの親を呼び出すform_valid()にフォームを処理します。また、両方の方法で結果を取得するための共通の場所に結果を保存していません。次のようなものを試してください:

def form_valid(self, form):
    self.data = form.cleaned_data
    return super(MainView, self).form_valid(form)

def get_context_data(self, **kwargs):
    context = super(MainView, self).get_context_data(**kwargs)
    context['data'] = self.data
    return context
于 2012-10-09T10:19:26.960 に答える
0

get_context_dataコンテキスト内で Djangoクラスベースのビュー docs を探します。オーバーライドされたメソッドによって返されたdictは、テンプレートに渡されます。

于 2012-10-03T21:24:59.090 に答える