[英]How to query fields from two related modelforms in a Django template?
我想做的是顯示一個列出所有作者的表格,並為每個作者列出他們各自的書籍。 我正在使用表單,因為可以從頁面修改某些字段。
模型.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)
表格.py
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
fields = '__all__'
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = '__all__'
所以在視圖中,我將包含兩個表單集的上下文傳遞給模板。
視圖.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)
在模板中,我可以遍歷各個表單集,但我無法弄清楚如何顯示每個作者的所有書名。 僅像使用常規模型一樣使用點表示法是行不通的。
索引.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 %}
我能夠通過使用“.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 的隱藏字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.