Django - цикл внешних ключей шаблона Django-Filter - PullRequest
0 голосов
/ 10 марта 2019

У меня есть Django FilterSet, который показывает на каждого инвестора инвестиции. Проблема в том, что в моем шаблоне (html browser) инвесторы, у которых есть 0 вложений, не отображаются.

Я почти уверен, что проблема заключается в том, как я фильтрую инвестиции. Set_all

Кто может мне помочь:) ??

большое спасибо всем!

models.py:

class Fund(models.Model):
 feeder = models.CharField(max_length=100)

 def __str__ (self):
    return  self.feeder

class Investor(models.Model):
 first_name = models.CharField(max_length = 100)
 last_name = models.CharField(max_length = 100)

def __str__ (self):
    return '%s %s' % (self.first_name, self.last_name)

class Investment(models.Model):
 feeder = models.ForeignKey(Fund, on_delete=models.CASCADE)
 investor = models.ForeignKey(Investor, on_delete=models.CASCADE)
 commitment = models.DecimalField(max_digits=20, decimal_places=2, default="1")

 def __str__ (self):
    return '%s %s' % (self.feeder, self.investor)

filters.py:

class InvestorFilter(django_filters.FilterSet):
 first_name = django_filters.CharFilter(field_name='first_name', lookup_expr='icontains')
 last_name = django_filters.CharFilter(field_name='last_name',lookup_expr='icontains')

views.py:

def investors_overview(request):
 investorfilter = InvestorFilter(request.GET, queryset=Investor.objects.all())
 return render(request, 'funds/investors.html', {'investorfilter' : investorfilter })

investors.html:

          <tbody>

            {% for investor in investorfilter.qs %}
            {% for investment in investor.investment_set.all %}
              <tr>
                <td>   {{investor.first_name}} </td>
                <td>   {{investor.last_name}}  </td>
                <td>   {{investment.feeder}} </td>
                <td>   {{investment.commitment}} </td>
              </tr>

            {% empty %}
              <tr>
                <td colspan="5"> No such investor exists</td>
              </tr>
            {% endfor %}
              {% endfor %}
        <p></p>
          </tbody>

1 Ответ

1 голос
/ 10 марта 2019

Я не совсем уверен, что вы спрашиваете здесь, но я думаю, что ваша проблема в том, что у вас есть выход инвесторов в цикле investment_set, а не снаружи.Это может быть больше, чем вы хотите:

{% for investor in investorfilter.qs %}
  <tr>
    <td>   {{investor.first_name}} </td>
    <td>   {{investor.last_name}}  </td>
  </tr>
  {% for investment in investor.investment_set.all %}
    <tr>
      <td colspan="2"></td>
      <td>   {{investment.feeder}} </td>
      <td>   {{investment.commitment}} </td>
    </tr>
  {% empty %}
    <tr>
      <td colspan="4"> Investor has no investments</td>
    </tr>
  {% endfor %}
{% endfor %}

, так что empty соответствует внутреннему циклу for, над инвестициями, с соответствующим сообщением об ошибке.

Редактировать

Мне трудно понять, что именно вы хотите.Вот решение, которое отображает инвестиции в той же строке, что и инвестор, но за счет некоторого дублирования как кода, так и вывода (поскольку теперь вы получаете инвестора один раз для каждой инвестиции);также я не могу понять, куда вы хотите, чтобы сообщение «Нет таких инвестиций» пошло.

{% for investor in investorfilter.qs %}
  {% for investment in investor.investment_set.all %}
    <tr>
      <td>   {{investor.first_name}} </td>
      <td>   {{investor.last_name}}  </td>
      <td>   {{investment.feeder}} </td>
      <td>   {{investment.commitment}} </td>
    </tr>
  {% empty %}
    <tr>
      <td>   {{investor.first_name}} </td>
      <td>   {{investor.last_name}}  </td>
    </tr>
  {% endfor %}
{% endfor %}
...