这个问题与这个 SO question类似,但我的情况有点不同,因为我想在重定向中保持我的表单状态(问题中提到的验证码错误)。
谢谢@petkostas 指出HTTP_REFERER
我对此的解决方案涉及使用从当前时间戳派生的缓存键将上下文存储在缓存中。我重定向到(相同的)评论 url,但在这样做时,我将当前评论页面作为获取参数附加,并将时间戳作为另一个获取参数。
然后在获取请求期间,视图检查时间戳参数是否存在。如果提供,则调用 cache.get 来检索所需的上下文数据。最后,缓存的项目被删除。
from datetime import datetime
from django.core.cache import cache
from django.shortcuts import redirect
from django.utils.dateformat import format
class MyView(CreateView):
def form_invalid(self, form, **kwargs):
context = {
'form': form,
... other context stuff ...
}
timestamp = format(datetime.now(), u'U')
cache.set('invalid_context_{0}'.format(timestamp), context)
page = 1
full_path = self.request.META.get('HTTP_REFERER')
if '?' in full_path:
query_string = full_path.split('?')[1].split('&')
for q in query_string:
if q.startswith('page='):
page = q.split('=')[1]
response = redirect('my_comments_page')
response['Location'] += '?page={0}&x={1}'.format(page, timestamp)
return response
def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
context.update({
... add context stuff ...
})
if 'x' in self.request.GET:
x = self.request.GET.get('x')
cache_key = 'invalid_context_{0}'.format(x)
invalid_context = cache.get(cache_key)
if invalid_context:
context.update(invalid_context)
cache.delete(cache_key)
return context