@Ozrae

Как реализовать такую конструкцию if, for в html файле?

Есть две модели Book и Author (коды будут ниже). Нужно написать так: если у Author есть Book, то каждый Book будет выводится в списке. Между Book и Author отношение Many-to-One:

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=1000, 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")
    language = models.ForeignKey('Language',  on_delete=models.SET_NULL, null=True)
    
    def display_genre(self):
        return ', '.join([genre.name for genre in self.genre.all()[:3]])
    display_genre.short_description = 'Genre'
    
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('book-detail', args=[str(self.id)])


class Author(models.Model):
    """
    Model representing an author.
    """
    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):
        """
        Returns the url to access a particular author instance.
        """
        return reverse('author-detail', args=[str(self.id)])
    

    def __str__(self):
        """
        String for representing the Model object.
        """
        return '%s, %s' % (self.last_name, self.first_name)
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Wondermarin
@Wondermarin
models.py:
class Book(models.Model):
    ...
    author = models.ForeignKey(Author, related_name="books", on_delete=models.SET_NULL, null=True)
    ...


views.py:
def index(request):
    context = {}
    authors = Author.objects.all()
    context['authors'] = authors
    return render(request, 'index.html', context)


index.html:
...
    <div>
        {% for author in authors %}
            <h1>{{ author.first_name }}</h1>
            {% for book in author.books.all %}
                <h4>{{ book.title }}</h4>
                {% empty %}
                    <p>Похоже, у этого автора нет книг :(</p>
            {% endfor %}
        {% endfor %}
    </div>
...


И модель автора у вас должна быть объявлена раньше модели книги.

Также советую ознакомиться с этим: https://docs.djangoproject.com/en/3.0/topics/db/qu...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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