【问题标题】:Sorting models in Django Template在 Django 模板中对模型进行排序
【发布时间】:2018-04-24 12:58:38
【问题描述】:

我有两个模型,一个是具有 addressprefixstart_time 等字段的 Lease 模型。第二个是具有 rangesubnet、@987654326 等字段的子模型@。我需要的是根据 Sub 的 range 字段将租约分类到它们所属的 Subs 中。

我为两者添加了字段以进行比较。这些字段是addr_cutaddr_end(用于租赁)和range_low_cutrange_low_endrange_high_end(用于子)。

我试图做的失败是这样的:

    {%for lease in leases%}
         {%for sub in subs%}
             {%if lease.addr_cut in sub.range_low_cut%}
                 {%if lease.addr_end >= sub.range_low_end%}
                     {%if lease.addr_end <= sub.range_high_end%}
                        <tr>
                            <td>{{lease.DUID_text }}</td>
                            <td>{{lease.addr_text}}</td>
                            <td>{{lease.pub_date}}</td>
                            <td>{{lease.e_date}}</td>
                            <td>{{lease.prefix}}</td>

                        </tr>

                    {%endif%}
                {%endif%}
            {%endif%}
        {%endfor%}
    {%endfor%}

现在如果我显示lease.addr_cutsub.range_low_cut 的内容:

2605:7300:201:3: 2605:7300:201:3:

看起来第一个 if 应该得到绿灯吧?错误的。无论内容是否相同,每次检查都会失败。我是新手,我知道我可能试图在模板中引入太多逻辑,但似乎这是基于显示的,所以它属于这里。

所以我的问题。如果模板中的逻辑过多,我应该在哪里以及如何实现此逻辑以将我的租约分类到它们所属的子网中。或者它可能只是执行错误,一个好心的陌生人可以指出我的语法错误。谢谢你们。

按要求提供参考型号:

class Lease(models.Model):
    DUID_text = models.CharField(max_length=100)
    addr_text = models.CharField(max_length=100)
    pub_date = models.CharField(max_length=100)
    e_date = models.CharField(max_length=100)
    prefix = models.CharField(max_length=100)
    addr_cut = models.CharField(max_length=100)
    addr_end = models.CharField(max_length=100)

    def __str__(self):
        return self.addr_cut

class Sub(models.Model):
    Name = models.CharField(max_length=100)
    subnet = models.CharField(max_length=100)
    rang = models.CharField(max_length=100)
    prefix = models.CharField(max_length=100)
    range_low_cut = models.CharField(max_length=100)
    range_low_end = models.CharField(max_length=100)
    range_high_cut = models.CharField(max_length=100)
    range_high_end = models.CharField(max_length=100)

    def __str__(self):
        return self.range_low_cut

成功!感谢所有花时间调查此事的人。按照大卫在答案中复制的链接,我可以到达我需要的地方。

【问题讨论】:

  • 最后一行你缺少},你在哪里关闭这些标签?如{% endif %}, {% endfor %}?
  • 抱歉,为简洁起见,我遗漏了其余代码,我的错误在于缺少 }。代码运行良好,没有抛出任何错误,只是没有给我预期的输出。
  • 你能展示你的模型吗?
  • 你去。感谢您的观看。

标签: django django-models django-templates django-views


【解决方案1】:

假设您没有显示所有代码,则 sn-p 缺少结束标记,它应该是

{%for lease in leases%}
     {%for sub in subs%}
         {%if lease.addr_cut in sub.range_low_cut%}
             {%if lease.addr_end >= sub.range_low_end%}
                 {%if lease.addr_end <= sub.range_high_end%}

您的代码还有另一个问题,使维护变得更加复杂。

我不鼓励使用嵌套 if。您可以将其重构如下

{%for lease in leases%}
     {%for sub in subs%}
         {%if lease.addr_cut in sub.range_low_cut and
              lease.addr_end >= sub.range_low_end and
              lease.addr_end <= sub.range_high_end%}

更进一步,您可以将 ifs 移动到函数中以提高清晰度:

{%for lease in leases%}
    {%for sub in subs%}
        {% build_table lease sub %}
    {%endfor%}
{%endfor%}

@register.simple_tag
def build_table(lease, sub):
    {%if lease.addr_cut in sub.range_low_cut and
         lease.addr_end >= sub.range_low_end and
         lease.addr_end <= sub.range_high_end%}

        return """
            <tr>
                <td>{{lease.DUID_text }}</td>
                <td>{{lease.addr_text}}</td>
                <td>{{lease.pub_date}}</td>
                <td>{{lease.e_date}}</td>
                <td>{{lease.prefix}}</td>
            </tr>
        """
    {%endif%}

另请参阅http://www.pfinn.net/custom-django-filter-tutorial.html 的另一个示例。

【讨论】:

  • 好的,谢谢。我将按照建议重构那些 if 语句。如果你能给我一个快速的指针。假设我不能将函数放在模板中,我应该把函数放在哪里?在视图/上下文中?抱歉,我是 django 的新手,并试图将我的头缠在什么地方把东西绑起来。
  • pfinn.net/custom-django-filter-tutorial.html 我想这可能是我需要前进的方向。
  • 该教程是一个很好的起点。我正在更新我的答案以供将来参考
  • build_table(lease, sub) --> Django 是否支持模板中的括号?
  • 我不这么认为。按照自定义过滤器的链接指南,我已经(几乎)搞定了所有事情。
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2017-07-17
  • 2018-02-04
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多