将 table 输出到模板

Outputting a table to a template

最近开始研究Django,无法理解如何正确实现模板(table) 我有一个模型: 她与公司和银行有联系。

class BankAccount(models.Model):
company = models.ForeignKey('Company.Company', null=True, on_delete=models.CASCADE, verbose_name='Фирма',
                            related_name='company')
bank = models.ForeignKey('Bank', null=True, on_delete=models.CASCADE, verbose_name='Банк', related_name='bank')
login_bank = models.CharField(max_length=255, verbose_name='Логин', null=False)
password_bank = models.CharField(max_length=255, verbose_name='Пароль', null=False)

date_created = models.DateTimeField(auto_now=True)
date_updated = models.DateTimeField(auto_now_add=True)
balance = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)

在模板中,我想显示一个 table,其中所有公司/银行都将显示在这些列和行的交集处,该模型的值将出现。 我一直在寻找答案 5 天

Company1 Company2 Company3 Company4
Bank1 Balance(Company1/Bank1) Balance(Company2/Bank1) Balance(Company/Bank1) Balance(Company4/Bank1)
Bank2 Balance(Company1/Bank2) .... .... ....
Bank3 Balance(Company1/Bank3) .... .... ....

我尝试了下面的示例模板,谢谢 @林阮

<table class="table table-bordered">
        <tr>
            <th> </th>
            {% for company in companies %}
                <th>{{ company.name }}</th>
            {% endfor %}
        </tr>
        {% for bank in banks %}
            <tr>
                <td>{{bank.name}} </td>
                {% for company in companies %}
                    {% for account in bank_accounts %}
                        {% if account.company_id == company.id and bank.id == account.bank_id %}
                            <td>{{account}}</td>
                        {% endif %}
                    {% endfor %}
                {% endfor %}
            </tr>
        {% endfor %}

    </table>



context = {
            'companies': Company.objects.all().order_by('id'),
            'banks': Bank.objects.all().order_by('id'),
            'bank_accounts': BankAccount.objects.all()
        }

但是结果还是不尽如人意。一家公司可以在 table 个账户 (bank_account) 中拥有 2 个和 4 个账户。 如果公司没有所有 4 个帐户,数据不再 match.If 你添加 {% else%},然后 table 完全中断。 screen

<div class="col-md-12">
    <div class="row">
        <table class="table table-bordered">
            <tr>
                <th> </th>
                {% for company in companies %}
                    <th>{{ company.name }}</th>
                {% endfor %}
            </tr>
            {% for bank in banks %}
                <tr>
                    <td>{{bank.name}} </td>
                    {% for company in companies %}
                       <td>
                           {% for account in bank_accounts %}

                                {% if account.company_id == company.id and bank.id == account.bank_id%}
                                    {{account}}
                                {% endif %}

                            {% endfor %}
                       </td>
                    {% endfor %}
                </tr>
            {% endfor %}

        </table>
    </div>
</div>

终于成功了!

首先,你应该像这样实现你的视图函数:

from django.shortcuts import render
from models import BackAccount

def get_bank_accounts(request):

accounts = BankAccount.objects.all()

context = {
    'accounts': accounts,
}
return render(request, 'accounts.html', context)

所以,这样您就可以将所有帐户发送到模板。以及您在 accounts.html 中使用它们的方式如下:

{% for account in accounts %}
  {{ account.bank }}
  {{ account.company }}
{% endfor %}

我认为这仅取决于您如何处理循环中的逻辑: 在您看来,您拥有所有银行、公司和银行账户的查询集 view.py:

context = {
       'companies': Company.objects.all(),
       'banks': Bank.objects.all(),
       'bank_accounts': BankAccount.objects.all()
   }

template.html:

<table style="width:100%">
   <tr>
       {% for company in companies %}
       <th>{{ company.name }}</th>
       {% endfor %}       
   </tr>
   {% for bank in banks %}
   <tr>
      {% for company in companies %}
        {% for bank_account in bank_accounts %}
          <td>
            {% if bank_account.company  == company %}
               Balance({{ company.name }}/{{ bank.name }})
            {% endif %}
          </td>
        {% endfor %}
      {% endfor %}
   </tr>
   {% endfor %}
</table>