Сортировка моделей в шаблоне Django - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть две модели, одна из которых - модель аренды, в которой есть поля типа address, prefix, start_time и т. Д. Вторая - модель Sub, в которой есть поля, такие как range, subnet, * 1006.*.Что мне нужно, так это отсортировать аренду по сабвуферам, в которые они входят, на основе поля диапазона саба.

Я добавил поля в оба для сравнения.Эти поля addr_cut, addr_end для аренды и range_low_cut, range_low_end и range_high_end для Sub.

То, что я пытаюсь сделать, но это не получается:

    {%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_cut и sub.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

Успех!Спасибо всем, кто нашел время, чтобы разобраться в этом.По ссылке, скопированной в ответе Дэвида, я попал туда, где мне нужно быть.

1 Ответ

0 голосов
/ 24 апреля 2018

Предполагая, что вы не показываете весь код, во фрагменте отсутствует закрывающий тег, и он должен читать:

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

У вашего кода есть еще одна проблема, которая усложняет его обслуживание.

Я не рекомендую использовать вложенные, если.Вы можете выполнить рефакторинг следующим образом:

{%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 для другого примера.

...