0

次の関数ベースのビューをクラス ベースのビューに変換しようとしています。

(基本的に、フォームが有効または無効に送信された後、ユーザーは同じページに再度リダイレクトされます)。

古いコード:

def handle_form(request, template_name='contact.html'):
    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            do_something()
    else:
        form = ContactForm()
    return render_to_response(template_name, {'form': form}, context_instance=RequestContext(request))

新しいコード:

class ContactFormView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact')

    def form_valid(self, form):
        do_something()
        return super(ContactFormView, self).form_valid(form)

新しいコードの微妙な違いは、フォームが有効な場合、フォームの送信された値が忘れられることです。古いコードの動作は、値が常に記憶されるというものでした。

どんな助けでも大歓迎です。

乾杯

4

2 に答える 2

1

FormView はフォームの標準フローを実装します。これは、データが入力されたフォームを正常に保存した後に再表示しないというものです。

必要なことを行うには、スーパークラスのメソッドに頼るのではなく、自分でフォームを保存してから、渡されたコンテキストでビューを再度レンダリングする必要があります。

class ContactFormView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm

    def form_valid(self, form):
        do_something()
        form.save()
        return self.render_to_response(self.get_context_data(form=form))
于 2013-01-24T05:11:22.020 に答える
0

form_valid は、テンプレートをレンダリングするのではなく、リダイレクトを実行します。デフォルトの動作を捨てて、通常のようにテンプレートをレンダリングする必要があります (モデルを保存していないと仮定します。それ以外の場合は、単純に URL にリダイレクトする必要があります)。

于 2013-01-23T20:41:48.343 に答える