如何在 Django 上下文视图中使用主键在 python for 循环中呈现 html

How to use Primary Key in Django context view to render on html in python for loop

我的观点中有这种方法,其次是我的html:

def index(request):

    context = {
        "user": User.objects.get(id = request.session['user_id']),
        "book": Book.objects.all(),
        "review": Book.objects.get(pk=1).book_reviews.all()
    }
    return render(request, "books_home.html", context)
    {% for Book in book %}
            {{Book.contributor.id}}<br>
            Book Title: <a href="{{Book.id}}">{{Book.title}}</a><br>
            Author: {{Book.author.name}}<br>
            Contributor: <a href="{{Book.contributor.id}}">{{Book.contributor.first_name}} {{Book.contributor.last_name}}</a><br>
            {% for book_reviews in review %}
                <a href="{{User.id}}">{{book_reviews.poster.first_name}} {{book_reviews.poster.last_name}}</a> says: {{book_reviews.content}}<br>
                Rating: {{book_reviews.rating}}<br>
                Posted on: {{book_reviews.created_at}}<br>
            {% endfor %}
            {% if Book.contributor.id == request.session.user_id %} <a href="reads/{{Book.id}}/delete">Delete All</a>{% endif %}
            <hr>

我在“审核”方面遇到问题:Book.objects.get(pk=1).book_reviews.all()pk=1 就是问题所在。我不知道如何 运行 通过每个 pk 以便呈现每个评论,而不仅仅是那些 pk=1.

型号

class Author(models.Model):
    name = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

class Book(models.Model):
    title = models.CharField(max_length=255)
    contributor = models.ForeignKey(User, related_name = "book_added", 
    on_delete = models.CASCADE)
    author = models.ForeignKey(Author, related_name = "book_written", 
    on_delete = models.CASCADE)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

class Review(models.Model):
    content = models.CharField(max_length=255)
    rating = models.IntegerField()
    poster = models.ForeignKey(User, related_name="user_reviews", 
    on_delete=models.CASCADE)
    book = models.ForeignKey(Book, related_name="book_reviews", 
    on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

评论与书籍相关,因此您无需单独添加评论上下文。评论将在模板迭代期间来自本书。理想情况下,您还可以在视图中使用 select_related or prefetch_related 来提高数据库查询的效率。

根据您的模型设置,您会做类似的事情;

def index(request):

    context = {
        "user": User.objects.get(id = request.session['user_id']),
        "books": Book.objects.all().prefetch_related('book_reviews'),
    }
    return render(request, "books_home.html", context)

如果您的模型链接到具有相关名称的评论,这将有效;


class Book(models.Model):

    reviews = models.ManyToManyField(Review, related_name='book_reviews')

然后你的模板会做类似

的事情
{% for book in books %}
    {{ book.title }}
    {% for review in book.reviews.all %}
        {{ review }}
    {% endfor %}
{% endfor %}

这里有一篇关于此的文章; https://medium.com/codeptivesolutions/prefetch-related-and-select-related-in-django-90f07a2379c0

代码来自评论;

>>> books = Book.objects.all().prefetch_related('book_reviews')
>>> for books in Book.objects.all().prefetch_related('book_reviews'): 
>>>     print(books.book_reviews) 
>>> reads_app.Review.None reads_app.Review.None

所以我认为你想用这个例子做的是;

>>> books = Book.objects.all().prefetch_related('book_reviews')
>>> for book in books: 
>>>     print(book.book_reviews.all()) 

那应该打印 Review 查询集。 book.book_reviews 应该是 RelatedManager 所以你应该可以用 all(), filter() 等等

查询