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

2024-05-15 02:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的视图中有此方法,然后是我的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)

Tags: namebridtrueautoonmodelsnow
1条回答
网友
1楼 · 发布于 2024-05-15 02:26:14

评论与书籍相关,因此不需要单独在上下文中添加评论。在模板的迭代过程中,评审将来自该书。理想情况下,您还应该在视图中使用^{}^{},以提高数据库查询的效率

根据您的模型设置,您将执行以下操作:

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()等查询该值

相关问题 更多 >

    热门问题