如何在 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()
等等
查询
我的观点中有这种方法,其次是我的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()
等等