Как запросить поля из двух связанных форм моделей в шаблоне Django? - PullRequest
0 голосов
/ 17 января 2020

Что я хотел бы сделать, так это показать таблицу, в которой перечислены все авторы, и для каждого автора перечислить свои соответствующие книги. Я использую форму, так как некоторые поля будут изменяемыми со страницы.

models.py


    class Author(models.Model):
        author_id = models.CharField(max_length=80, primary_key=True)
        first_name = models.CharField(max_length=80)
        last_name = models.CharField(max_length=80)

    class Book((models.Model):
        book_id = models.CharField(primary_key=True)
        title = models.CharField(max_length=200)A
        author_id = models.ForeignKey(Author, on_delete=models.CASCADE)

forms.py


    class AuthorForm(forms.ModelForm):
        class Meta:
            model = Author
            fields = '__all__'

    class BookForm(forms.ModelForm):
        class Meta:
            model = Book
            fields = '__all__'

Так что в представление, я передаю контекст, который содержит два набора форм в шаблон.

views.py


if request.method == 'GET':
    author_dbrecords = Author.objects.all()
    author_fields = [ f.name for f in Author._meta.get_fields() if not f.is_relation ]
    authors_detail_list = [{ field:getattr(author, field) for field in author_fields } for author in author_dbrecords ]

    book_dbrecords = Book.objects.all()
    book_fields = [ f.name for f in Book._meta.get_fields() if not f.is_relation ]
    books_detail_list = [{ field:getattr(book, field) for field in book_fields } for book in book_dbrecords ]

    author_formset = AuthorFormSet(initial=authors_detail_list, prefix='author')
    book_formset = AuthorFormSet(initial=book_detail_list, prefix='book')

    context = {
        'author_formset':author_formset,
        'book_formset':book_formset,
    }
    return render(request, 'index.html' context)

В шаблоне я могу l oop через отдельные наборы форм, но Я не могу понять, как показать все названия книг для каждого автора. Просто использование точечной нотации, как для обычной модели, не работает.

index. html


    <form action="{% url 'index' %}" method="post">
    {{ author_formset.management_form }} {{ book_formset.management_form }}
      {% for author in author_formset %}
        <tr>
          {% for author_field in author %}
            <td> {{ author_field }}</td>
          {% endfor %}
          {{% for book_field in book.author %}
            <td> {{ book_field }}</td>
          {% endfor %}

1 Ответ

0 голосов
/ 26 января 2020

Мне удалось решить эту проблему путем эффективного доступа к базовой модели (а не к форме) в шаблоне с помощью «.instance» и использования _set для обратной связи. Я написал собственный метод для извлечения всех полей из модели Book.


      {% for author_field in author %}
        <td> {{ author_field }}</td>
      {% endfor %}
      {% for book in author.instance.book_set.all %}
       {% for book_field in book.get_fields %}
        <td> {{ book_field }}</td>
       {% endfor %}
      {% endfor %}

Новый метод в models.py:

    def get_fields(self):
        return [(field.value_to_string(self)) for field in Book._meta.fields]

На данный момент единственным недостатком является то, что я не могу проверить скрытые поля BookForm в шаблоне.

...