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