【发布时间】:2015-10-24 07:36:46
【问题描述】:
在 Python/Django 中,我有一个 FormView,允许您临时添加某些字段选择。
(示例:从汽水下拉菜单中选择汽水)
选择最喜欢的汽水:[_Soda_Choices_Dropdown_] +添加汽水
我希望能够即时添加苏打水,当我保存苏打水时,我希望成功 URL 成为将您带到那里的页面。
[第1页] --> [新建苏打FormView] --成功-> [第1页]
最好的方法是什么?
谢谢!
【问题讨论】:
在 Python/Django 中,我有一个 FormView,允许您临时添加某些字段选择。
(示例:从汽水下拉菜单中选择汽水)
选择最喜欢的汽水:[_Soda_Choices_Dropdown_] +添加汽水
我希望能够即时添加苏打水,当我保存苏打水时,我希望成功 URL 成为将您带到那里的页面。
[第1页] --> [新建苏打FormView] --成功-> [第1页]
最好的方法是什么?
谢谢!
【问题讨论】:
编辑:
最好在请求中使用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 action 中传递,并在重定向时使用。
在您的 soda formview 模板中,以 action 的形式指定 next 参数。
<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 是一个标准的 Python 字典,包含所有可用的 HTTP 标头。其中一个标题是HTTP_REFERER,其中包含引用页面(如果有)。
由于您使用的是FormView,因此您可以覆盖get_success_url() 函数以在成功时重定向到将用户购买到MySodaFormView 的页面。我们将使用request.META 字典中的HTTP_REFERER 的值来获取此页面。
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
注意:使用来自request.META 字典的HTTP_REFERER 可能不是“最佳实践”,因为某些浏览器已关闭传递引用功能或为用户提供禁用该功能的选项。在这种情况下,您的重定向将无法正常工作。您可以改为在 url 和 get_success_url() 函数中传递 ?next= 参数,使用 next 的值来获取要重定向到的 url。
【讨论】:
Page 1 不是固定页面。用户可以根据问题从多个页面访问MySodaFormView页面。
HTTP_REFERER 是表单页面的 URL,而不是用户最初来自的页面的 URL
def soda_view(request):
# your code goes here
url = "{0}/{1}".format(request.META.get('HTTP_REFERER', '/'), args)
return HttpResponseRedirect(url)
【讨论】:
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
【讨论】:
当您使用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 的视图的名称。
【讨论】: