【问题标题】:Like button is working but not changing to Unlike in djangoLike 按钮正在工作,但在 django 中没有更改为 Like
【发布时间】:2021-04-09 22:20:11
【问题描述】:

我已经尝试与我的专家编码员一起调试此问题一天,但我们无法在此处确定问题。点赞按钮可以正常工作,我可以查询总点赞数,但 Clap 按钮不会更改为不喜欢,我们不确定原因。我相信错误在于 html 行:

{% if liked and post.slug == blog_post.slug %} Unlike {% else %} Like {% endif %}

或 django 行:

context["liked"] = True if blog_post.likes.filter(id=request.user.id).exists() else False

非常感谢您能在此处发现问题!

views.py

def home_feed_view(request, *args, **kwargs):
    context = {}
    blog_posts = BlogPost.objects.all()
    context['blog_posts'] = blog_posts 
    if request.method=="POST":
        slug=request.POST["submit_slug"]
        blog_post = get_object_or_404(BlogPost, slug=slug)
        context['blog_post'] = blog_post
        context["liked"] = True if blog_post.likes.filter(id=request.user.id).exists() else False
        context['total_likes'] = blog_post.total_likes()
    type_of_post = TypeofPostFilter(request.GET, queryset=BlogPost.objects.all())
    context['type_of_post'] = type_of_post

    paginated_type_of_post = Paginator(type_of_post.qs, 13 )
    page = request.GET.get('page')
    post_page_obj = paginated_type_of_post.get_page(page)

    context['post_page_obj'] = post_page_obj

    return render(request, "HomeFeed/snippets/home.html", context)


def LikeView(request, slug):
    context = {}
    user = request.user
    if not user.is_authenticated:
        return redirect('must_authenticate')
    post = get_object_or_404(BlogPost, slug=slug)
    liked = False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        liked = False
    else:
        post.likes.add(request.user)
        liked = True
    return redirect(request.META.get('HTTP_REFERER', ''))
<td class="table-primary">
   <form action="{% url 'HomeFeed:like_post' post.slug %}" method="POST"> 
       {% csrf_token %} 
              
       <button type="submit" name="submit_slug" value="{{ post.slug }}" class='btn btn-primary btn-sm'>

       {% if liked and post.slug == blog_post.slug %} Unlike {% else %} Like 
       {% endif %}

       </button> 
       {{ post.total_likes }} Clap {{ post.total_likes|pluralize }}
         
   </form>
</td> 

urls.py

path('<slug>/like/', LikeView, name='like_post'),

models.py

class BlogPost(models.Model):
    chief_title = models.CharField(max_length=50, null=False, blank=False)
    body = models.TextField(max_length=5000, null=False, blank=False)
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(blank=True, unique=True)


【问题讨论】:

  • 你能完全显示你的models.py吗?
  • @SLDem 嗨,兄弟,我已经更新了 models.py

标签: python html django forms querying


【解决方案1】:

好的,这里有一个更简单的方法来检查一个模型是否存在于另一个模型的 m2m 字段中:

html

{% if request.user in blog_post.likes.all %} Unlike {% else %} Like {% endif %}

查看

if request.user in blog_post.likes.all():

PS 在您的模型中,您应该将字段 likes 重命名为 likers,因为它与 User 模型而不是 Like 模型的关系:)

编辑

因此,要在您想在模板中执行此操作的单个页面上轻松显示帖子列表及其相应的按钮:

views.py

def posts(request): 
    blog_posts = BlogPost.objects.all()
    return render(request, 'index.html', {'blog_posts': blog_posts})

index.html

{% for post in blog_posts %}

    <h1>{{ post.chief_title }}</h1>
    <p>{{ post.author }} says: </p>
    <b>{{ post.body }}</b>
    <p> This post is liked by: </p>
    {% for user in post.likes %}
        <p>{{ user.username }}</p>
    {% endfor %}
    
    {% if request.user not in post.likes.all %} 
        <a href="{% url 'like_post' post.slug %}">Like</a>
    {% else %} 
        <a href="{% url 'like_post' post.slug %}">Unlike</a>
    {% endif %}

{% endfor %}

【讨论】:

  • 嗨,兄弟,我应该将此添加到视图的哪个部分? if request.user in blog_post.likes.all():
  • 因为我仍然开始学习 django,我认为改变和修改我的整体观点从喜欢到喜欢的人是相当困难的哈哈
  • 对于初学者来说,您根本不应该在视图中执行此操作,因为您在同一页面上有多个对象,因此在 queryset(django 对象列表中显示这些对象会容易得多) 并使用 jinja2s for 循环语法来遍历它们并显示带有链接的类似按钮,我将在编辑中显示一个示例
  • 确定 1 秒,我也加一下
  • 谢谢兄弟!!我会注意并尝试在另一种情况下实施您的建议。只是确认您没有为此添加回复吗? : :嗨,兄弟,我应该将它添加到视图的哪个部分?如果 request.user 在 blog_post.likes.all():
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2017-08-24
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多