【问题标题】:Using HttpResponseRedirect() in a Django view where context has to be passed在必须传递上下文的 Django 视图中使用 HttpResponseRedirect()
【发布时间】:2017-05-10 02:02:41
【问题描述】:

在我的这个 Django 应用程序中,我使用 ListView 类来列出用户上传的照片。人们可以对这些照片投赞成票或反对票。未经认证的用户可以看到照片,但不能投票。

我的用户中有不可忽视的部分使用不支持 JS 的旧设备。对于此类用户,upvote 或 downvote 不支持 AJAX。相反,整个页面都会刷新。

我确保页面刷新仍然让这些用户看到他们投票的同一张照片。我通过 HTML 中的 <a name="section{{ forloop_counter }}"> 标记执行此操作。

我每页显示 20 张照片,即 20 个部分。投票后,我将 photo_id 传递给 ListView 类的 def get(self, request, *args, **kwargs) 方法。我计算出 photo_id 出现在哪个section_num 中。然后我只需执行return HttpResponseRedirect(section_num)。这使我处于正确的位置,例如http://example.com/?page=1#section8.

我的问题是:假设我正在编写自己的自定义视图来列出照片等,而不是使用ListView class。在这种情况下,如何实现上述HttpResponseRedirect(section_num) 功能?一个说明性的例子会很棒。提前致谢!


这是我的自定义视图:

    def photos_list(request, *args, **kwargs):
        form = PhotosListForm()
        ob_list = retrieve_latest_photos(request.user.id)
        paginator = Paginator(ob_list, 20)
        page = request.GET.get('page', '1')
        try:
            page = paginator.page(page)
        except PageNotAnInteger:
            page = paginator.page(1)
        except EmptyPage:
            page = paginator.page(paginator.num_pages)
        context = {'object_list': ob_list, 'form':form, 'page':page,'username':request.user.username}
        return render(request, 'photos_list.html', context)

注意:我阅读了this SO question,但无法辨别它对我的情况有何帮助。部分是因为我是初学者,但也因为那里的操作似乎有不同的问题

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    您的问题不清楚 - 但是,您是否考虑过使用 <a name="section{{ object.id }}"><div id="photo-{{ object.id }}"> 并重定向到 #photo.id 而不是计算?

    【讨论】:

    • Udi,感谢您的提示。我的问题是:我必须将context 字典传递给模板,因此我在自定义视图 中使用render()。现在我需要做什么才能重定向到页面中的特定锚标记?使用 ListView 类,我可以在 get() 方法中使用 HttpResponseRedirect。使用自定义视图时会怎样?
    • 是的,您可以从自定义视图中使用它。
    • 好的,知道了。基本上vote 将调用自定义重定向视图,它使用HttpResponseRedirect 来获取正确的锚标记。至于关于使用object.id 的提示——我解释得不够清楚——我还需要推断出页码,因为照片列表是分页的。 IE。计算?page=1#section8 而不仅仅是#section8。如果我在答案中使用您的提示,我该怎么做?
    • 好问题。有几个选项。一个乐观的方法是记住操作前的页码并再次显示。我会选择这个。如果您知道排序顺序,则可以计算出现在项目之前的项目,然后将其除以页面大小。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2015-09-24
    • 1970-01-01
    相关资源
    最近更新 更多