这个问题与this SO question类似,但是由于我想在重定向中维护我的表单状态(问题中提到的验证码错误),所以我的情况稍有不同。
谢谢@petkostas您指出HTTP_REFERER
我解决这一涉及存储与当前时间戳获得的缓存键在缓存中的内容。我重定向到(相同)注释url,但是在这样做时,我将当前注释页面作为get参数添加,并将时间戳添加为另一个get参数。
然后在获取请求期间,视图检查是否存在timestamp参数。如果提供,则调用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
谢谢@petkostas回应。我的问题是,我不知道如何重定向到完整路径并发送上下文数据。我将编辑我的问题。 – pymarco