Как создать поле выбора из набора запросов и реализовать его в форме - PullRequest
2 голосов
/ 10 ноября 2019

Я создал простое книжное приложение с 3 моделями: Книга, Автор, Жанр. Все отлично работает, и теперь я хочу создать Select-Field для жанра. Содержимое поля выбора должно быть набором запросов из существующих жанров. Поле выбора должно быть в шаблоне, и когда я выбираю жанр и нажимаю кнопку поиска, в нем должен быть указан жанр и его книги. Поскольку я не могу понять, что мне нужна ваша помощь по следующим вопросам:

  1. Где мне нужно создать поле выбора и можно ли его реализовать?
  2. Что мне нужно сделатьсделать в views.py?

Вот что я сделал до сих пор в forms.py:

class GenreSelectForm(forms.Form):
    categories = forms.ModelChoiceField(queryset=Genre.objects.all())

Кроме того, я создал шаблон (genre_select.html) следующим образом:

{% block content %}
  <h4>Searching</h4>
  <form action="" method="GET"></form>
  {{ form.as_p }}
  <button type="submit">Search</button>
{% endblock %}
Однако я не знаю, является ли это правильным способом и как его реализовать.

Вот мои модели.py

from django.db import models


class Genre(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self):
        return self.name

    @property
    def get_books(self):
        return Book.objects.filter(genre__name=self.name)


class Author(models.Model):
    name = models.CharField(max_length=128)
    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=128)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE) 
    isbn = models.CharField(max_length=10)
    price = models.DecimalField(max_digits=7, decimal_places=2)
    date_published = models.DateField()

    def __str__(self):
        return self.title

1 Ответ

2 голосов
/ 10 ноября 2019

Вы можете отправить все жанры в шаблоне из представлений, таких как

 def your_view(request):

        if request.method == 'GET':
            genres = Genre.objects.all()
            context = {'genres ' : genres }
            return render(request,'genre_select.html',context)
        else: #post method
            genres = Genre.objects.all()
            genre = request.POST.get('name_of_your_select_tag')
            books = Book.objects.filter(genre=genre)
            context = {
                        'genres ' : genres,
                        'books' : books,
                      }
            return render(request,'genre_select.html',context)

, вы можете написать приведенный выше код, который отображает шаблон genre_select.htmlи в своем шаблоне вы можете написать что-то вроде

{% block content %}
  <h4>Searching</h4>
  <form action="" method="GET"></form>
  <select>
    {% for genre in genres %}
    <option value="{{genre.id}}"> {{genre.name}} </option>
    {% endfor %}
  </select>
  <button type="submit">Search</button>
{% endblock %}

, и, по вашему мнению, вы можете получить genre_id и показать книги, соответствующие этому жанру. указанным выше способом вам не нужно включать поле жанра в forms.py

...