【问题标题】:django return nothing/to the exact same location after a user's action用户操作后,django 不返回任何内容/返回完全相同的位置
【发布时间】:2021-02-16 23:06:58
【问题描述】:

我正在做一个 reddit 克隆项目,其中一个功能是进行 upvote/downvote。我希望用户能够在 post-list.html 页面上单击 upvote/downvote 并显示更新,仅此而已。我试图返回 None 但 django 不允许它。我试图返回“/”,但随后 django 从顶部返回了一个网页。

另外,我觉得我的upvote/downvote需要很长时间才能更新,这很奇怪,我想知道是否有办法加快它。

这是我的 base.html,它具有 upvote/downvote 功能:

{% for post in posts %}
    <div class="post">
      <div class="vote">{% include "Reddit_app/vote-thumbnail.html" with el=post %}</div>

这里是 vote-thumbnail.html

<div class="voting_panel">
    <div class="vote-logo"><a class="glyphicon glyphicon-chevron-up
      {% if el|user_has_voted:user == 1 %} text-success {%else%} text-muted {% endif %}" href="{% url 'upvote-thumbnail' pk=el.pk %}"></a></div>
    <div class="score">{{ el.get_score }}</div>
    <div class="vote-logo"><a class="glyphicon glyphicon-chevron-down
      {% if el|user_has_voted:user == -1 %} text-success {%else%} text-muted {% endif %}"  href="{% url 'downvote-thumbnail' pk=el.pk %}"></a></div>
</div>

这是我的 urls.py 和帖子链接

    path('content/<uuid:pk>/upvote-thumbnail/', views.vote_thumbnail, {'is_upvote': True}, name='upvote-thumbnail'),
    path('content/<uuid:pk>/downvote-thumbnail/', views.vote_thumbnail, {'is_upvote': False}, name='downvote-thumbnail')
    path('', views.post_list, name='post_list'),

这是我的意见.py

def vote_thumbnail(request, pk, is_upvote):
    content_obj = Votable.get_object(pk)
    content_obj.toggle_vote(request.user, UserVote.UP_VOTE if is_upvote else UserVote.DOWN_VOTE)
    return redirect('/')  #what to return here?

【问题讨论】:

  • post-list.html 使用什么 url 路径。你能分享你的 post-list.html 的 url 路径吗?您可以通过该 url 路径的名称简单地重定向到该 url 路径:redirect("post-list")
  • 这种事情几乎总是通过ajax请求来完成。了解ajax基础知识是一个很好的学习项目。给出如何做到这一点的完整示例超出了堆栈溢出的范围。但是如果你谷歌“django ajax 教程”,你会发现很多例子。

标签: python django


【解决方案1】:

要重定向到上一个网址,我们可以使用request.META.get('HTTP_REFERER')或使用redirect("post_list")

def vote_thumbnail(request, pk, is_upvote):
    content_obj = Votable.get_object(pk)
    content_obj.toggle_vote(request.user, UserVote.UP_VOTE if is_upvote else UserVote.DOWN_VOTE)
    # redirect to the previous page
    return redirect("post_list") # or redirect(request.META.get('HTTP_REFERER')) 

您可以将id 属性添加到您的链接&lt;a id={{ el.pk }}&gt;,然后在您的网址href="{% url 'downvote-thumbnail' pk=el.pk %}#{{ el.pk }}" 中使用hash:

<div class="vote-logo">
    <a id="{{ el.pk }}" class="glyphicon glyphicon-chevron-down {% if el|user_has_voted:user == -1 %} text-success {% else %} text-muted {% endif %}" href="{% url 'downvote-thumbnail' pk=el.pk %}#{{ el.pk }}"></a>
</div>

浏览器窗口将自己(立即)滚动到具有 ID 的元素可见的位置。

【讨论】:

  • 当我执行 request.META.get('HTTP_REFERER') 时,它会将我引导回投票链接.. 这是一个空白页面
  • 你在用ajax吗?
  • @llu13701,试试:return redirect("post_list")
  • 如果我做redirect("post_list"),那么它会返回到页面顶部..我希望它返回到确切的位置
  • @llu13701,您可以将id 属性添加到您的链接&lt;a id={{ el.pk }}&gt;,然后在您的网址href="{% url 'downvote-thumbnail' pk=el.pk %}#{{ el.pk }}" 中使用hash。我更新了我的答案。
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多