Python 根据django中是否喜欢照片更改按钮
我在我的网站上添加了一个功能,用户可以在这里喜欢帖子 我已经成功地做到了这一点,但是我在添加一个功能时遇到了困难 这是按钮中的文本,取决于帖子是否受欢迎 现在,无论帖子是否受欢迎,按钮都保持不变 models.pyPython 根据django中是否喜欢照片更改按钮,python,django,django-templates,Python,Django,Django Templates,我在我的网站上添加了一个功能,用户可以在这里喜欢帖子 我已经成功地做到了这一点,但是我在添加一个功能时遇到了困难 这是按钮中的文本,取决于帖子是否受欢迎 现在,无论帖子是否受欢迎,按钮都保持不变 models.py class Post(models.Model): file = models.ImageField(upload_to='images/') summary = models.TextField(max_length=600) pub_date = mode
class Post(models.Model):
file = models.ImageField(upload_to='images/')
summary = models.TextField(max_length=600)
pub_date = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
likes = models.ManyToManyField(User, through='Like', related_name='likes')
def __str__(self):
return self.user.username
def pub_date_pretty(self):
return self.pub_date.strftime('%b %e %Y')
def summary_pretty(self):
return self.summary[:50]
@property
def total_likes(self):
return self.likes.count()
class Like(models.Model):
status = models.BooleanField()
post = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
views.py
def likepost(request, post_id):
if request.method == 'POST':
post = get_object_or_404(Post, pk=post_id)
user = request.user
if post.likes.filter(id=user.id).exists():
post.likes.remove(user)
return redirect('home')
else:
like = Like()
like.post = post
like.user = user
like.status = True
like.save()
post.likes.add(user)
return redirect('home')
我的模板:
{% if post.likes.status == True %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Unlike {{ post.total_likes }} </button></a>
{% else %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Like {{ post.total_likes }} </button></a>
{% endif %}
{% if like.status == True %}
编辑2:
{% extends 'accounts/base.html' %}
{% block content %}
{% load static %}
{% for post in posts.all %}
<div class="container pl-5">
<div class="row pt-3">
<img src="{% static 'grey.jpg' %}" width="600px" height="60px">
<div class="pt-3 pl-5" style="position: absolute;"> <b> {{ post.user.username }} </b> </div>
</div>
<br>
<div class="card" style="width: 600px; bottom: 24px; right: 15px;">
<img src="{{ post.file.url }}" width="599px">
</div>
<br>
<div class="card" style="width: 600px; bottom: 50px; right: 15px;"> <img src="{% static 'grey.jpg' %}" width="600px" height="150px"> </div>
<div class="col-6" style="bottom:145px; left: 5px;">
<div style="position: absolute;"> <b> {{ post.user.username }} </b> {{ post.summary_pretty }}</div>
</div>
{% for like in post.likes.all %}
{{like.username}}
{% endfor %}
{% if like.status %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Unlike {{ post.total_likes }} </button></a>
{% else %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Like {{ post.total_likes }} </button></a>
{% endif %}
<form id="likepost{{ post.id }}" method="POST" action="{% url 'likepost' post.id %}">
{% csrf_token%}
<input type="hidden">
</form>
</div>
<br>
<br>
<br>
{% endfor %}
{% endblock %}
{%extends'accounts/base.html%}
{%block content%}
{%load static%}
{posts.all%}
{{post.user.username}
{{post.user.username}{{post.summary_pretty}}
{post.likes.all%中的like的百分比}
{{like.username}
{%endfor%}
{%if like.status%}
{%else%}
{%endif%}
{%csrf_令牌%}
{%endfor%}
{%endblock%}
在您的模型中,您已将likes
定义为多个域
域:
class Post(models.Model):
likes = models.ManyToManyField(User, through='Like', related_name='likes')
但在模板中,您正试图从许多类似对象中获取一个布尔值:
{% if post.likes.status == True %}
post.likes
将返回多个对象。相反,您需要根据用户获取类似的内容
编辑:
获得类似状态的一种方法是在视图中执行以下操作:
context['like'] = Like.objects.get(post=post, user=request.user)
然后在模板中:
{% if post.likes.status == True %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Unlike {{ post.total_likes }} </button></a>
{% else %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Like {{ post.total_likes }} </button></a>
{% endif %}
{% if like.status == True %}
您使用的是哪个版本的django?由于基于函数的视图,您需要在重定向之前调用
post.save()
。我使用的是最新版本的django。此外,我在重定向之前添加了post.save(),但仍然会出现相同的问题。您是否在Javascript.submit()
函数中进行页面刷新?除非进行页面刷新,否则模板将保持不变,并且like按钮不会更改,因此post.likes将返回多个对象。我如何根据用户得到类似的结果。我该如何在我的网站上实现这一点?@djangoninja看到编辑中的建议,并尝试一下这与主视图有关吗?我应该将此代码放在哪里?当我把它放到我的主视图中时,它会返回一个错误,说“Post is not defined”,检查我添加了我的主视图cod的原始帖子。(这会呈现主页)