16

クラスQuestionViewから派生したFormViewクラスがあります。私の問題を説明するコードスニペットは次のとおりです。

class QuestionView(FormView):
    ...
    context_var1 = y

    def form_valid (self, form):
        ...
        self.context_var1 = x
        ...

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

上に示したように、一連のコンテキスト変数をform_valid更新し、これらの更新された値をテンプレートで使用するつもりです。つまり、context辞書の変数です。このコードの問題は、 の変更 context_var1が見られないことです。メソッドget_context_dataの前に が呼び出されたことが原因である可能性があります。form_validこれに対する回避策はありますか?

4

5 に答える 5

26

でこれを行いform_invalidます。これが私がそれを行う方法です:

from django.views.generic import FormView

class ContextFormView(FormView):
    def get(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(**kwargs)
        context['form'] = form
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form, **kwargs)

    def form_invalid(self, form, **kwargs):
        context = self.get_context_data(**kwargs)
        context['form'] = form
        return self.render_to_response(context)

form_valid を除いて同じことができます。通常、form_valid の本体は次のようになります。

def form_valid(self, form):
    return HttpResponseRedirect(self.get_success_url())

を呼び出すため、postとの両方をオーバーライドする必要があります。form_validpostform_valid

def post(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    if form.is_valid():
        return self.form_valid(form, **kwargs)
    else:
        return self.form_invalid(form, **kwargs)

def form_valid(self, form, **kwargs):
    # take some other action here
    return HttpResponseRedirect(self.get_success_url())

ああ、明確にするために、この問題が存在する理由は、ProcessFormViewクラスのgetメソッドが壊れていることです。通常は次のようになります。

def get(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    return self.render_to_response(self.get_context_data(form=form))

それはクワーグを捨てるだけです(._.)

于 2011-11-22T05:56:59.727 に答える
3

views.py で

class UploadTest(FormView):
    template_name = 'test.html'
    ....
    plus_context = dict()

    def form_valid(self, form):
        ...
        self.plus_context['you_want_context'] = value
        ...
        return super(UploadTest, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(UploadTest, self).get_context_data(**kwargs)
        context['plus_context_key'] = self.plus_context
        return context

test.html で

<html>
    ....
    <body>
    ....
    // first post can not get plus_context_key
    {% if plus_context_key %}
        {{ plus_context_key.you_want_context }}
    {% endif %}    
    </body>
</html>

私はDjango 1.10.3でこの方法を理解しました。希望はあなたを助けることができます

于 2016-11-17T10:32:07.663 に答える