【问题标题】:How to query fields from two related modelforms in a Django template?如何从 Django 模板中的两个相关模型表单中查询字段?
【发布时间】:2020-05-04 11:12:41
【问题描述】:

我想做的是显示一个列出所有作者的表格,并为每个作者列出他们各自的书籍。我正在使用表单,因为某些字段可以从页面中修改。

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)

在模板中,我可以遍历各个表单集,但我不知道如何显示每位作者的所有书名。像常规模型那样仅使用点表示法是行不通的。

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 %}

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    我能够通过使用“.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 的隐藏字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2020-01-11
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多