我有一個書籍模型和一個型別模型,它們具有多對多的關系。我將如何在串列視圖中獲取特定型別的所有書籍。我假設使用諸如“genre.objects.book_set.all”之類的查詢來獲取流派物件并從中獲取所有書籍會更快,而不是瀏覽所有書籍并查看它們是否具有指定的流派。但是我不確定如何在 ListView 中做到這一點?我想從 url 中獲取流派名稱,然后使用它來獲取流派物件。
這是我所擁有的:
網址.py:
path('genre/<string:name>', GenreListView.as_view(), name='book-genre'),
模型.py:
class Genre(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=150, unique=True)
description = models.TextField()
user_count = models.IntegerField()
pages = models.IntegerField()
genres = models.ManyToManyField(Genre)
image = models.ImageField(default='book_imgs/default.jpg', upload_to='book_imgs')
def __str__(self):
return self.name
視圖.py
class GenreListView(ListView):
model = Genre
def get_queryset(self):
Not sure what to put here....
return
uj5u.com熱心網友回復:
您應該通過id流派,然后在get_queryset方法中應用過濾器以通過以下方式獲取特定流派的所有書籍:
網址.py
path('genre/<int:id>/', GenreListView.as_view(), name='book_genre'),
視圖.py
class GenreListView(ListView):
model = Book
template_name = 'any_folder_name/any_file_name.html'
context_object_name = 'specific_books'
def get_queryset(self):
qs = super().get_queryset()
return qs.filter(genres=self.kwargs['id'])
然后,您可以在模板中顯示與特定型別相關的書籍。
any_file_name.html
<body>
{% for book in specific_books %}
<div>
<p>{{book.name}}</p>
<p>{{book.description}}</p>
<p>{{book.pages}}</p>
</div>
<br>
{% endfor %}
</body>
或者,您也可以簡單地使用基于功能的視圖來完成。
網址.py
path('genre/<int:id>/', views.specific_books, name='specific_books'),
視圖.py
def specific_books(request, id):
specific_books = Book.objects.filter(genres=id)
return render(request, 'any_folder_name/any_file_name.html', {'specific_books': specific_books})
編輯:
如果要通過 name 過濾所有書籍Genre,請執行以下操作:
網址.py
path('genre/<str:name>/', views.specific_books, name='specific_books'),
視圖.py
def specific_books(request, name):
specific_books = Book.objects.filter(genres__name__icontains=name)
return render(request, 'home/index.html', {'specific_books': specific_books})
uj5u.com熱心網友回復:
你可以這樣做:
class SciFiListView(View):
scifi_books = Book.objects.filter(genres__name__icontains="scifi")
return render(request, "books/list.html", {"scifi_books": scifi_books})
list.html
{% for book in scifi_books %}
<p>{{ book.name }} | {{ book.description }}</p>
{% endfor %}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487286.html
