在Python / Django中,我有一个FormView,允许你临时添加某些字段选择。
(例如:从苏打水下拉菜单中选择苏打水)
选择最喜欢的苏打水:[_ Soda_Choices_Dropdown_] +添加苏打水
我希望能够即时添加苏打水,当我保存苏打水时,我希望成功网址成为将您带到那里的页面。
[第1页] - > [创建新苏打FormView] - 成功 - > [第1页]
实现这一目标的最佳方法是什么?
谢谢!
答案 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
的视图的名称。