Python 如果条件没有按照django中对like按钮的预期响应
事实上,我的帖子有一个正常工作的like按钮,但是如果用户已经喜欢这个帖子,我想把它改成不喜欢。但我无法使用if条件更改按钮Python 如果条件没有按照django中对like按钮的预期响应,python,html,django,Python,Html,Django,事实上,我的帖子有一个正常工作的like按钮,但是如果用户已经喜欢这个帖子,我想把它改成不喜欢。但我无法使用if条件更改按钮 <!-- Use an element to toggle between a like/dislike icon --> <i onclick="myFunction(this)" class="fa fa-thumbs-up"></i> view.py文件 def home(request): post = get_obj
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
view.py文件
def home(request):
post = get_object_or_404(Post, id=id)
is_liked = False
if post.likes.filter(id=request.user.id).exists():
is_liked = True
context = {
'posts': Post,
'is_liked':is_liked,
}
return render(request, 'blog/home.html',context)
def like_post(request):
post = get_object_or_404(Post,id=request.POST.get("post_id"))
is_liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
is_liked = False
else:
is_liked = True
post.likes.add(request.user.id)
return HttpResponseRedirect(post.get_absolute_url())
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
html文件:
<form action="{% url 'like_post' %}" method="post">
{% csrf_token %}
{% if is_liked %}
<button type="submit" name="post_id" value="{{ post.id }}" class= "btn btn-danger">Dislike</button>
{% else %}
<button type="submit" name="post_id" value="{{ post.id }}" class= "btn btn-info">Like</button>
{% endif %}
</form>
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
{%csrf_令牌%}
{%if_%}
不喜欢
{%else%}
喜欢
{%endif%}
要设置自定义标记,请执行以下步骤:
from django import template
register = template.Library()
class SetVarNode(template.Node):
def __init__(self, var_name, var_value):
self.var_name = var_name
self.var_value = var_value
def render(self, context):
try:
value = template.Variable(self.var_value).resolve(context)
except template.VariableDoesNotExist:
value = ""
context[self.var_name] = value
return u""
def set_var(parser, token):
"""
{% set <var_name> = <var_value> %}
"""
parts = token.split_contents()
if len(parts) < 4:
raise template.TemplateSyntaxError("'set' tag must be of the form: {% set <var_name> = <var_value> %}")
return SetVarNode(parts[1], parts[3])
register.tag('set', set_var)
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
function myFunction(x) {
x.classList.toggle("fa-thumbs-down");
}
指定自定义模板标记和过滤器的最常见位置是Django应用程序内部。如果它们与现有的应用程序相关,将它们捆绑在那里是有意义的;否则,它们可以添加到新的应用程序中。当Django应用程序添加到已安装的_应用程序中时,它在下面描述的常规位置定义的任何标记都会自动提供给模板中加载
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
应用程序应该包含一个templatetags
目录,与models.py、views.py等处于同一级别。
如果这个目录还不存在,请创建它-不要忘记\uuu init\uuuuuuuuuuuuuuuuuuuuuupy
文件,以确保该目录被视为Python包
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
创建一个set_var.py
文件
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
自定义设置标签.py:
from django import template
register = template.Library()
class SetVarNode(template.Node):
def __init__(self, var_name, var_value):
self.var_name = var_name
self.var_value = var_value
def render(self, context):
try:
value = template.Variable(self.var_value).resolve(context)
except template.VariableDoesNotExist:
value = ""
context[self.var_name] = value
return u""
def set_var(parser, token):
"""
{% set <var_name> = <var_value> %}
"""
parts = token.split_contents()
if len(parts) < 4:
raise template.TemplateSyntaxError("'set' tag must be of the form: {% set <var_name> = <var_value> %}")
return SetVarNode(parts[1], parts[3])
register.tag('set', set_var)
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
function myFunction(x) {
x.classList.toggle("fa-thumbs-down");
}
在post请求中,必须保存在模型中所做的更改(使用.save()方法)。此外,您没有使用类似is_的变量:
<!-- Use an element to toggle between a like/dislike icon -->
<i onclick="myFunction(this)" class="fa fa-thumbs-up"></i>
def like_post(request):
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.id)
post.save()
return HttpResponseRedirect(post.get_absolute_url())
您面临的问题/错误是什么?将
{%is_liked%}
更改为{{is_liked}}
并在控制台中打印以检查您得到的输出。我没有任何问题或错误,甚至like按钮也可以正常工作。。。。但是html页面上显示的按钮不会根据if条件做出反应。我总是只看到“喜欢”按钮,但当用户已经喜欢时,我希望看到“不喜欢”按钮it@shaikmoeed我没有看到任何东西,所以,这就是你在默认情况下在else块中获得按钮的原因。是的,我知道我没有使用它,但是我想用它来显示HTMLI中显示的按钮之间的差异,我不明白你的意思。条件不起作用,因为您没有在模型中进行更改。我已在我的模型中添加了此项:likes=models.ManyToManyField(User,related_name='likes',blank=True)能否请您尝试我的解决方案,并给我一个关于其工作原理的答案?我已经尝试过,结果没有差异,但是谢谢你的帮助time@nikhilbodduluri对不起,这是我的代码中存在的打字错误。请立即检查。错误:“set”,应为“empty”或“endfor”。您忘记注册或加载此标签了吗?包装在带有更新答案的中。请检查并确认错误:“with”预期至少有一个变量赋值我知道你在为我努力,兄弟,但我有一个。。。。错误:“设置”,应为“elif”、“else”或“endif”。您是否忘记注册或加载此标签?