Saya bekerja di jejaring sosial. Saya ingin memuat komentar dari setiap posting jadi saya membuat panggilan API ke server untuk mengambil semua komentar dari posting yang diperlukan. Kode akan membuat semuanya jelas:

urls.py

path("comments/<int:post_id>", views.load_comments)

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    commented_by = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.CharField(max_length=128)

views.py

def load_comments(request, post_id):
    """Returns the comments to index.js"""

    try:
        # Filter comments returned based on post id
        post = Post.objects.get(pk=post_id)

        comments = list(Comment.objects.filter(post=post).values())
        
        return JsonResponse({"comments": comments})
    except:
        return JsonResponse({"error": "Post not found", "status": 404})

index.js

fetch(`/comments/${post_id}`)
.then(res => res.json())
.then(res => {

    // Appoints the number of comments in the Modal title
    document.querySelector("#exampleModalLongTitle").textContent = `${res.comments.length} Comments`;

    res.comments.forEach(comment => {
        
        modal_body = document.querySelector(".modal-body")

        b = document.createElement("b");
        span = document.createElement("span");
        br = document.createElement("br");
        span.classList.add("gray")

        b.textContent = comment.commented_by_id + " ";
        span.textContent = comment.comment;

        modal_body.appendChild(b);
        modal_body.appendChild(span);
        modal_body.appendChild(br);

    })

Saya bisa mendapatkan nilai komentar menggunakan comment.comment di js. Namun, masalah muncul ketika saya mengonversi objek comments menjadi list.values jadi sekarang saya kehilangan kemampuan untuk mendapatkan pengguna yang memposting komentar (commented_by)

Bantuan apa pun untuk mendapatkan nilai comment dan commented_by sangat dihargai.

Saya juga mencoba di views.py:

def load_comments(request, post_id):
    """Returns the comments to index.js"""
    try:
        # Filter comments returned based on post id
        post = Post.objects.get(pk=post_id)

        post_comments = Comment.objects.filter(post=post)
        
        comments = []

        for comment in post_comments:
            comments.append({
                "comment": comment.comment,
                "commented_by": commented_by,
                })

        comments = serializers.serialize('json', comments)
        return HttpResponse(comments, content_type='application/json')
        
    except:
        return JsonResponse({"error": "Post not found", "status": 404})

Namun ketika saya mencoba ini, itu menghasilkan kesalahan.

1
user15440172 12 Mei 2021, 23:13

2 jawaban

Jawaban Terbaik

Di Django, fungsi values() untuk bidang ForeignKey secara default mengembalikan id dari objek terkait dengan kunci yang dibentuk dengan menambahkan nama bidang dengan "_id". Jadi dalam kasus Anda, Anda memiliki ID pengguna di bawah kunci commented_by_id.

Jika dengan "kehilangan kemampuan untuk mendapatkan pengguna yang memposting komentar" yang Anda maksud adalah info pengguna lain, seperti nama pengguna, maka Anda dapat meneruskan bidang yang Anda perlukan ke fungsi values() .

comments = list(Comment.objects
                       .filter(post=post)
                       .values("comment", 
                               "commented_by__username"
                               ))

Akan memberikan dict dengan teks komentar dan nama pengguna (dengan asumsi Anda memiliki bidang username dalam model Pengguna Anda.

1
Igor Moraru 12 Mei 2021, 21:22

1- Anda harus menggunakan Django_Rest_framework karena sangat mudah untuk bekerja dengan api dan menunjukkan bidang terkait

2- gunakan Post.objects.get(id=post_id) alih-alih pk

Atau Anda harus melewati langkah ini dengan memfilter komentar tergantung pada id posting secara langsung sepertiComment.objects.all().filter(post_id=post_id)

0
zain al-abdeen 12 Mei 2021, 20:57