Фильтрация значений django из выпадающего списка
Имеется поле для выбора жанра книги:
<select class="filter" name="filter">
{% for genre in Genres %}
<option value="{{genre}}">{{genre}}</option>
{% endfor %}
</select>
И вывод всех книг, выбранного жанра:
{% for book in Books %}
{% if book.genre == 'sport' }
<img src='/static/media/{{book.img\}}' class="img">
<h5> {{book.name}} </h5>
{% endif %}
{% endfor %}
Нужно сделать так, чтобы при выборе жанра в выпадающем списке, результаты фильтровались по этому жанру (вместо 'sport' было то, что выбрал пользователь). Каким способом это можно реализовать средствами django?
Файл models.py:
class Genres(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Books(models.Model):
name = models.CharField(max_length=64)
genre = models.ManyToManyField(Genre)
img = models.ImageField(upload_to = 'images')
def __str__(self):
return self.name
Ответы (1 шт):
Автор решения: Max
→ Ссылка
Убираем условие:
{% if book.genre == 'sport' }
{% endif %}
Вместо фильтра на сайте:
<select class="filter" name="filter">
{% for genre in Genres %}
<option value="{{genre}}">{{genre}}</option>
{% endfor %}
</select>
Создаём GET запрос:
<form method=GET>
{{ Genre }}
</form>
С помощью GET запроса фильтруем значения в файле views.py:
def index(request):
if request.GET:
books = Book.objects.filter(genre__name__exact=request.GET['Genre']) #filter
else:
books = Book.objects.all()
genres = GenreChoiceField()
context = {
'Books':books,
'Genre':genres,
}
return render(request, 'index.html', context)