使用POST数据确认通用FormView POST成功返回给用户

时间:2012-02-13 22:10:36

标签: python django django-forms django-generic-views

使用通用FormView我想反映一些有关提交给用户的POST数据的内容,但我不确定如何最好地执行此操作。

class MyView(generic.FormView):
    form_class = MyForm
    def get_success_url(self):
        return reverse('success')

reverse('success')重定向到一个简单的

class SuccessView(generic.TemplateView):
    template_name = 'success.html'

我是否可以通过params调用访问SuccessView中的get_success_url对象,或者有更好(更简单)的方法吗? TIA Dan

更新(我的解决方案,但感谢您的想法)

我实际上发现这是(对我而言)解决问题的最简单方法:

class SuccessMixin(object):
    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_valid(self, form):
        # this is my post processing step which returns the
        # feedback data that I want to pass to the user
        form_data = form.get_some_data_from_form()
        return render_to_response('submitted.html', 
            {'form_data': form_data,}, 
            context_instance=RequestContext(self.request))

每个视图都继承了这个mixin,如果表单有效,那么我从中提取反馈数据并将其作为响应呈现 - 完全绕过get_success_url重定向。我已删除get_success_urlSuccessView

3 个答案:

答案 0 :(得分:5)

将数据作为GET参数包含在您的成功网址中。

def get_success_url(self):
   url = reverse('success')
   # maybe use urlencode for more complicated parameters
   return "%s?foo=%s" % (url, self.request.POST['bar'])

然后在模板中,访问GET数据中的参数。

foo: {{ request.GET.foo }}

答案 1 :(得分:2)

我试图解决这个问题,一个简单的解决方案就是使用:

from django.contrib import messages

在get_success_url(self)中你可以写

def get_success_url(self)
    messages.add_message(self.request, messages.SUCCESS, 'Contact Successfully Updated!')
    return reverse('contacts:contact_detail', args=(self.get_object().id,))

在您的模板中,您可以通过

访问此消息
{% for message in messages %}
    {{ message }}
{% endfor %}

答案 2 :(得分:1)

实现目标的一种方法是使用Sessions。在用户的会话对象上存储您需要的任何值,并从SuccessView中访问它们。查看Django session documentation了解更多详情。