【问题标题】:Outputting a table to a template将表格输出到模板
【发布时间】:2021-08-06 11:34:32
【问题描述】:

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

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)

在模板中,我想显示一个表格,其中所有公司/银行都将显示在这些列和行的交叉处,该模型的值将出现。 我一直在寻找答案 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) .... .... ....

我尝试了下面的示例模板,谢谢 @Linh Nguyen

<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()
        }

但结果仍然不理想。一家公司可以在账户表 (bank_account) 中有 2 个和 4 个账户。 如果公司没有全部4个帐户,则数据不再匹配。如果添加{% else%},则表格完全中断。 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>

终于成功了!

【问题讨论】:

  • 看来你的if语句逻辑错误,请将放在if条件之外
  • 很遗憾,即使去掉这个IF语句,图片也没有任何变化(((
  • 我的意思不是删除 if 语句,如果你看一下我写的模板,td 标签在 if 之外,所以当它不匹配时,它会有一个空的 td跨度>
  • 如果你把td标签放在div里面如果不匹配td就不会生成,顺序当然是错误的
  • 我的 if 语句 if 相当于 {% if %} {{account}} {% else %}

标签: django django-models django-templates django-orm


【解决方案1】:

我认为这只能归结为您如何处理循环中的逻辑: 在您看来,您拥有所有银行、公司和银行账户的查询集 视图.py:

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

模板.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>

【讨论】:

  • 您的回答非常接近我的愿望。但仍然不是那样。我附上你的代码截图link
  • @DickDikins 您也只需要显示其他属性。这只是你应该如何实现它的一个例子。
  • 是的,这只是向您展示如何处理逻辑的示例,因为我没有您的数据库或您的意图流,我无法复制您想要的内容,但我可以向您展示如何去做
  • OOO 然后非常感谢您的提示,然后我继续尝试
  • 您的逻辑对我的解决方案还缺少什么?如果只是属性我已经创建了循环逻辑,您可以替换其中的属性
【解决方案2】:

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

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

【讨论】:

  • 非常感谢,但问题是如何将上下文传递给模板,我明白了。我对它的实施有疑问。事实证明,您必须遍历三个 qeuryset。但我不明白如何实现这一点。
  • @DickDikins render 方法处理将上下文传递给模板。
  • 我知道非常感谢。很可能,问题不在于将上下文传递给模板,而在于通过“for”循环显示它
  • @DickDikins 好的,知道了。你的问题不完全是关于 Django 的。下次注意标签。
  • 对于给您带来的不便,我深表歉意。但我认为模板与 django 有关。好的,我会考虑到这一点,很抱歉浪费您的时间
猜你喜欢
相关资源
最近更新 更多
热门标签