2014-01-21 22 views
0

我有一个分页的评论页面。分页由django-endless-pagination提供。当点击新的分页页面时,get参数被追加到url。如?page=4Django:如何在CreateView form_invalid后将用户返回到正确的分页页面?

每个分页页面上的每条评论都会显示一个包含验证码字段的'回复'评论表单。

我的看法使用CreateView和我实现了form_invalid我自己为了添加一些数据到上下文变量。在我form_invalid方法结束时,我回到self.render_to_response(context)

的问题

如果用户试图第4页回复评论时,与该用户供应和无效的验证码,然后分页GET参数( ?page=4)在响应期间丢失。

如何重定向到完整路径(保持获取参数)并传递上下文数据?

感谢

回答

1

这个问题与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 
0

我没有使用Django的无端分页,但Django还提供了2种方式来获得为完整当前请求的路径,或请求的Refferer: 您认为或模板(检查文档关于如何使用模板的要求),引荐请求页面:

request.META.get('HTTP_REFERER') 

或当前请求的完整路径:

request.full_path() 
+0

谢谢@petkostas回应。我的问题是,我不知道如何重定向到完整路径并发送上下文数据。我将编辑我的问题。 – pymarco

相关问题