В общем, нужен фильтр написанный на чистом JS, так как я его только начал учить и в JQuery не лез и пока не собираюсь. Я пытался реализовать его в самом Django, и вроде даже получилось: была форма с выпадающим списком, который формировался вот таким генератором authors
class FilterForm(forms.Form):
authors = ((i.id, f'{i.first_name} {i.last_name}') for i in Author.objects.all())
reason = forms.ChoiceField(choices=authors)
Далее была функция представления (пришлось перейти с класса на функцию, так как, судя по всему, пост и гет нельзя обработать через класс ListView)
def bookList(request):
book_list = Book.objects.all()
if request.method == 'GET':
form = FilterForm(request.GET)
if form.is_valid():
reason = form.cleaned_data['reason']
book_list = Book.objects.filter(author_id=reason)
else:
form = FilterForm()
context = {
'book_list': book_list,
'form': form,
}
Тут я передавал в контекст сам список и форму.
reason = form.cleaned_data['reason'] - эта строка получала первый элемент(PrimaryKey автора по совместительству) из выбранного мной варианта после нажатия кнопки Submit и путем изменения book_list на сайте появлялся список книг выбранного автора.
Проблема в том, что при таком раскладе пагинатор реализовать будет сложнее, а кнопку для сброса фильтров я вообще без понятия как сделать. Поэтому мне хотелось бы узнать, как сделать фильтр по авторам(И не только) на JS.
Прикрепил модель Книги:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
summary = models.TextField(max_length=2000, help_text="Enter a brief description of the book")
isbn = models.CharField('ISBN', max_length=13, help_text='13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')
genre = models.ManyToManyField(Genre, help_text="Select a genre for this book")
lang = models.CharField('Language', max_length=200, null=True, blank=True)
release_year = models.DateField('Release year', null=True, blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', args=[str(self.id)])
def display_genre(self):
"""
Creates a string for the Genre. This is required to display genre in Admin.
"""
return ', '.join([genre.name for genre in self.genre.all()[:3]])
display_genre.short_description = 'Genre'
И модель Автора:
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
def get_absolute_url(self):
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
return '%s, %s' % (self.last_name, self.first_name)
HTML форма была вот такой:
<form method="GET">
{{form}}
<input type="submit" value="Submit">
</form>