Задать вопрос
@IWantToBelievee

Как сделать фильтр списка для сайта на Django?

В общем, нужен фильтр написанный на чистом 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>
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы