回到那个带你去Django的页面

时间:2015-08-01 21:08:43

标签: python django formview

在Python / Django中,我有一个FormView,允许你临时添加某些字段选择。

  

(例如:从苏打水下拉菜单中选择苏打水)

     

选择最喜欢的苏打水:[_ Soda_Choices_Dropdown_] +添加苏打水

我希望能够即时添加苏打水,当我保存苏打水时,我希望成功网址成为将您带到那里的页面。

[第1页] - > [创建新苏打FormView] - 成功 - > [第1页]

实现这一目标的最佳方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:3)

编辑:

最好在请求中使用next参数,以重定向到购买我们的页面,而不是使用HTTP_REFERER

假设您在页面some_page.html上有MySodaFormView页面的链接。在此处,将request.path作为next参数传递。这将在重定向时使用。

<a href='/my/soda/form/page/?next={{request.path}}'>Create new soda</a> 

然后在MySodaFormView呈现页面时,在上下文中传递next参数。此参数将在form操作中传递,并在重定向时使用。

在您的soda formview模板中,在next格式中指定action参数。

<form method="POST" action="/my/soda/form/page/?next={{next_url}}">

您的观点如下所示:

class MySodaFormView(FormView):

    def get_context_data(self, **kwargs):
        context = super(MySodaFormView, self).get_context_data(**kwargs)
        context['next_url'] = self.request.GET.get('next') # pass `next` parameter received from previous page to the context 
        return context

    def get_success_url(self):
        next_url = self.request.GET.get('next')
        if next_url:
            return next_url # return next url for redirection
        return other_url # return some other url if next parameter not present

编辑:使用HTTP_REFERER的以下方法可能无法正常工作,因为某些浏览器已关闭传递引用功能或为用户提供禁用该功能的选项。

要返回在那里购买的页面,您可以使用HttpRequest.META词典中的HTTP_REFERER标题。

HttpRequest.META是包含所有可用HTTP标头的标准Python字典。其中一个标题是HTTP_REFERER,其中包含引用页面(如果有)。

由于您使用的是FormView,因此您可以覆盖get_success_url()功能,将成功时重定向到将用户购买到MySodaFormView的页面。我们将使用HTTP_REFERER字典中的request.META值来获取此页面。

from django.views.generic.edit import FormView

class MySodaFormView(FormView):

    def get_success_url(self):
        referer_url = self.request.META.get('HTTP_REFERER') # get the referer url from request's 'META' dictionary
        if referer_url:
            return referer_url # return referer url for redirection
        return other_url # return some other url if referer url not present

注意:使用HTTP_REFERER词典中的request.META可能不是最佳做法&#34;因为某些浏览器已关闭传递引用功能或为用户提供禁用该功能的选项。在这种情况下,您的重定向将无法正常工作。您可以在网址和?next=函数中传递get_success_url()参数,使用next的值来获取要重定向到的网址。

答案 1 :(得分:0)

def soda_view(request):
   # your code goes here

   url = "{0}/{1}".format(request.META.get('HTTP_REFERER', '/'), args)

   return HttpResponseRedirect(url)

答案 2 :(得分:0)

FormView以及具有FormMixin的其他基于类的基于视图的视图都有一个方法get_success_url(),您可以使用该方法返回到同一页面。它看起来像这样:

from django.core.urlresolvers import reverse

def get_success_url(self):
    return reverse('url_name_of_page_1')

或者,要将其与Geo Jacob的答案结合起来,请从HTTP标题中获取引用URL:

def get_success_url(self):
    if 'HTTP_REFERER' in request.META:
        return request.META['HTTP_REFERER']
    else:
        # Do something with the error case

答案 3 :(得分:0)

当您使用FormView时,只需执行以下操作:

from django.shortcuts import reverse

class YourView(FormView):
    success_url = reverse('first-page')

urls.py

url(r'/foo/bar/', some.view, name='first-page'),

first-page是在图表中呈现Page 1的视图的名称。