Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回相对请求django_Python_Django - Fatal编程技术网

Python 如何返回相对请求django

Python 如何返回相对请求django,python,django,Python,Django,在我的django项目中,我构建了一个有点像button的东西。问题是,我只有在详细查看一篇文章时才拥有它,现在我想把它放在主页上,在主页上显示多篇文章。问题是,按钮的Like函数返回到详细页面,但我想使返回依赖于Like来自的url,这样我就可以在主页或任何页面上向前滚动,而不会返回到其他页面。下面是我的views.pyLike函数: def PostLike(request, pk): post = get_object_or_404(Post, id=request.POST.ge

在我的django项目中,我构建了一个有点像button的东西。问题是,我只有在详细查看一篇文章时才拥有它,现在我想把它放在主页上,在主页上显示多篇文章。问题是,按钮的Like函数返回到详细页面,但我想使返回依赖于Like来自的url,这样我就可以在主页或任何页面上向前滚动,而不会返回到其他页面。下面是我的
views.py
Like函数:

def PostLike(request, pk):
    post = get_object_or_404(Post, id=request.POST.get('post_id'))
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
    else:
        post.likes.add(request.user)

    return HttpResponseRedirect(reverse('post-detail', args=[str(pk)]))

简而言之:我如何更改Like函数,以便返回到我喜欢的页面?

我认为您应该使用Ajax请求,这样您就不会重新加载页面了。只需用JavaScript处理它。
否则,您可以根据request.referer值重定向以返回单击的视图

我认为您应该使用Ajax request,这样您甚至不会重新加载页面。只需用JavaScript处理它。
否则,您可以根据request.referer值重定向以返回单击的视图

您的函数将返回重定向,这就是重定向到详细信息页面的原因

如果您想在单击“Like”后保持在同一页面上,您可以通过Ajax提交请求并返回JsonResponse,其中包含一条消息或一个值,具体取决于您从数据库查询中获得的内容

如何做到这一点取决于您使用的JS库或框架。下面是一个简单的JQuery示例:

in views.py

from django.http import JsonResponse
from django.shortcuts import get_object_or_404


def like_or_unlike(request, id):
    if request.user.is_authenticated:
        try:
            post = get_object_or_404(Post, id=id)
            if post.likes.filter(id=request.user.id).exists():
                post.likes.remove(request.user)
                message = 'You unliked post ' + id
            else:
                post.likes.add(request.user)
                message = 'You liked post ' + id
        except:
            message = 'Error processing like for post ' + id

    else:
        message = 'You must be logged in to like a post.'

    return JsonResponse({ 'result': message })
在URL.py中

from django.urls import path
from . import views


urlpatterns = [
    ...
    path("like/<id>/", views.like_or_unlike),
]
从django.url导入路径
从…起导入视图
URL模式=[
...
路径(“like/”,视图。like_或_-inspect),
]
在template.html中

<button class="{% if post.liked %}color-blue{% else %}color-white{% endif %}" 
id="post_{{ post.id|stringformat:"s" }}" 
onclick="postLike( '{{ post.id|stringformat:"s" }}' )"> Like this post </button>

<script>
  function postLike(id) {
    var element = "#post_" + id
    $.ajax({
      url: '/like/' + id,
      type: 'get',
      contentType: 'application/json',
      success: function(data) {
        console.log(data);
        if $(element).hasClass("color-white") {
          $(element).removeClass("color-white");
          $(element).addClass("color-blue");
        } else {
          $(element).removeClass("color-blue");
          $(element).addClass("color-white");
        }
      },
      error: function(jqXhr, textStatus, errorThrown) {
        console.log(errorThrown);
      }
    });
  }
</script>
喜欢这个帖子吗
函数postLike(id){
var element=“#post"”+id
$.ajax({
url:'/like/'+id,
键入:“get”,
contentType:'应用程序/json',
成功:功能(数据){
控制台日志(数据);
if$(元素).hasClass(“白色”){
$(元素).removeClass(“白色”);
$(元素).addClass(“蓝色”);
}否则{
$(元素).removeClass(“蓝色”);
$(元素).addClass(“白色”);
}
},
错误:函数(jqXhr、textStatus、errorshown){
console.log(错误抛出);
}
});
}

您的函数返回重定向,这就是您被重定向到详细信息页面的原因

如果您想在单击“Like”后保持在同一页面上,您可以通过Ajax提交请求并返回JsonResponse,其中包含一条消息或一个值,具体取决于您从数据库查询中获得的内容

如何做到这一点取决于您使用的JS库或框架。下面是一个简单的JQuery示例:

in views.py

from django.http import JsonResponse
from django.shortcuts import get_object_or_404


def like_or_unlike(request, id):
    if request.user.is_authenticated:
        try:
            post = get_object_or_404(Post, id=id)
            if post.likes.filter(id=request.user.id).exists():
                post.likes.remove(request.user)
                message = 'You unliked post ' + id
            else:
                post.likes.add(request.user)
                message = 'You liked post ' + id
        except:
            message = 'Error processing like for post ' + id

    else:
        message = 'You must be logged in to like a post.'

    return JsonResponse({ 'result': message })
在URL.py中

from django.urls import path
from . import views


urlpatterns = [
    ...
    path("like/<id>/", views.like_or_unlike),
]
从django.url导入路径
从…起导入视图
URL模式=[
...
路径(“like/”,视图。like_或_-inspect),
]
在template.html中

<button class="{% if post.liked %}color-blue{% else %}color-white{% endif %}" 
id="post_{{ post.id|stringformat:"s" }}" 
onclick="postLike( '{{ post.id|stringformat:"s" }}' )"> Like this post </button>

<script>
  function postLike(id) {
    var element = "#post_" + id
    $.ajax({
      url: '/like/' + id,
      type: 'get',
      contentType: 'application/json',
      success: function(data) {
        console.log(data);
        if $(element).hasClass("color-white") {
          $(element).removeClass("color-white");
          $(element).addClass("color-blue");
        } else {
          $(element).removeClass("color-blue");
          $(element).addClass("color-white");
        }
      },
      error: function(jqXhr, textStatus, errorThrown) {
        console.log(errorThrown);
      }
    });
  }
</script>
喜欢这个帖子吗
函数postLike(id){
var element=“#post"”+id
$.ajax({
url:'/like/'+id,
键入:“get”,
contentType:'应用程序/json',
成功:功能(数据){
控制台日志(数据);
if$(元素).hasClass(“白色”){
$(元素).removeClass(“白色”);
$(元素).addClass(“蓝色”);
}否则{
$(元素).removeClass(“蓝色”);
$(元素).addClass(“白色”);
}
},
错误:函数(jqXhr、textStatus、errorshown){
console.log(错误抛出);
}
});
}

所以。。。我制作了一个连接到JavaScript函数的按钮,它为模型proberty“likes”添加了1。。。问题是:我如何为这个类似的函数设置规则(你只能喜欢一次,等等)?请参阅下面的答案。。。我制作了一个连接到JavaScript函数的按钮,它为模型proberty“likes”添加了1。。。问题是:我如何为这个like函数设置规则(你只能喜欢一次,等等)?请参见下面的答案,但在这种情况下,我不需要为我的Post模型包含likes问题,是吗?我现在是否必须包含url
/postlike/
?是的,您需要有ajax调用的url,并将其指向view函数,我已添加到答案中。我假设您的模型中已经有一个“likes”属性,因为您正在代码中使用它,如果您不想在模板中显示帖子的“liked”状态,您可能应该有一个属性。一对一字段不起作用,一篇帖子可能会被许多用户喜欢,而一个用户可能会喜欢许多帖子。您可以在Posts模型中使用多对多“喜欢”字段,也可以使用单独的喜欢模型。这里有一篇文章:将Ajax脚本放在使用它的页面上,通过base.htmlb加载JQuery,但在这种情况下,我不需要为我的Post模型包含类似于likes的问题,是吗?我现在是否必须包含url
/postlike/
?是的,您需要为Ajax调用提供一个url,并将其指向view函数,我补充了答案。我假设您的模型中已经有一个“likes”属性,因为您正在代码中使用它,如果您不想在模板中显示帖子的“liked”状态,您可能应该有一个属性。一对一字段不起作用,一篇帖子可能会被许多用户喜欢,而一个用户可能会喜欢许多帖子。您可以在Posts模型中使用多对多“喜欢”字段,也可以使用单独的喜欢模型。这里有一篇文章:将Ajax脚本放在使用它的页面上,通过base.html加载JQuery