喜欢计数未显示在 html 中,想知道我的模型是否设置正确

问题描述 投票:0回答:1

这是我的 models.py 和index.html 和views.py 我尝试了上述方法,我希望在我的索引页中获得总点赞数,但我只得到 0 个点赞,为什么会发生这种情况。我该如何解决它。

`from django.contrib.auth.models import AbstractUser
from django.db import models
from datetime import datetime
from django.contrib.auth import get_user_model


class CustomUser(AbstractUser):
    profile_picture = models.ImageField(
        upload_to="profile_pics/", blank=True, null=True
    )
    # Add any other custom fields as needed

    def __str__(self):
        return self.username


class Post(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    title = models.CharField(max_length=1000)
    content = models.TextField()
    created_at = models.DateTimeField(default=datetime.now, null=True, blank=True)
    likes = models.ManyToManyField(
        get_user_model(), related_name="liked_posts", blank=True
    )


class Like(models.Model):
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.user.username} likes {self.post.title}"`

and this is my index.html


`{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
<h2>Welcome to the Home Page!</h2>

{% for post in posts %}
<!-- Display post details as needed -->
<div>
    <h3>{{ post.title }}</h3>
    <small>{{post.created_at}}</small>
    <p>{{ post.content }}</p>
    <form id="likeForm{{ post.id }}" data-post-id="{{ post.id }}" method="post">
        {% csrf_token %}
        <input type="submit" value="Like post">
        <span id="likeCount{{ post.id }}">{{ post.likes.count }}</span> Likes
    </form>

</div>
{% endfor %}
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
<script>
    $(document).ready(function () {
        $('form[id^="likeForm"]').submit(function (event) {
            event.preventDefault();  // Prevent the default form submission

            var postID = $(this).data('post-id');

            // Send an AJAX request to the server
            $.ajax({
                type: 'POST',
                url: '/like/',  
                data: {
                    'post_id': postID,
                    'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()
                },
                success: function (data) {
                    // Update the like count on success
                    $('#likeCount' + postID).text(data.likes);
                },
                error: function (error) {
                    console.log('Error:', error);
                }
            });
        });
    });


</script>

{% endblock %}`
and my views.py

`from django.shortcuts import render, redirect
from .forms import SignUpForm
from django.contrib import messages
from .models import Post, Like
from django.http import JsonResponse
from django.shortcuts import get_object_or_404


# Create your views here.
def index(request):
    posts = Post.objects.all()
    return render(request, "index.html", {"posts": posts})


def register(request):
    if request.method == "POST":
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data["username"]
            messages.success(request, f"{username} has been registered")
            return redirect("index")
    form = SignUpForm()
    return render(request, "register.html", {"form": form})


def create(request):
    if request.method == "POST":
        title = request.POST.get("title")
        content = request.POST.get("content")

        user = request.user
        new_post = Post.objects.create(title=title, content=content, user=user)
        new_post.save()
        posts = Post.objects.all()
        return redirect("index")
    return render(request, "create.html")


def like_post(request):
    if request.method == "POST":
        post_id = request.POST.get("post_id")
        post = get_object_or_404(Post, id=post_id)
        user = request.user

        # Check if the user has already liked the post
        if Like.objects.filter(user=user, post=post).exists():
            return JsonResponse(
                {"error": "You have already liked this post"}, status=400
            )

        # Create a new like
        like = Like(user=user, post=post)
        like.save()
        print(Like.objects.filter(post=post).count())

        # Return the updated like count as JSON
        updated_likes_count = Like.objects.filter(post=post).count()
        print(updated_likes_count)
        print("n")
        return JsonResponse({"likes": updated_likes_count})
    else:
        return JsonResponse({"error": "Invalid request"}, status=400)`

我尝试了上述方法,我希望在我的索引页中获得总点赞数,但我只得到 0 个点赞,为什么会发生这种情况。我该如何解决它 它不允许我发帖,所以我添加了一些额外的单词......................mkefekjafjdakfkfkjf lorem ipsum wejldskjdskdkjdjj

JJ J J J J J

J 为什么YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YYYYYYYYY.

python-3.x django django-templates backend
1个回答
0
投票

好的。

1) 删除

likes = models.ManyToManyField(         get_user_model(), related_name="liked_posts", blank=True     )

来自 Post 模型的一部分。

2) 添加

    @property   
    def post_like_count(self):
        count = Like.objects.filter(post=self).count()
        return count

在你

之后
def __str__(self): 

功能。内部邮政模型。

  1. 内部模板使用
>{{ post.post_like_count }}
© www.soinside.com 2019 - 2024. All rights reserved.