Шаблоны Django - доступ к атрибуту и ​​значению M2M по имени - PullRequest
0 голосов
/ 18 февраля 2010

Я пытаюсь просто получить доступ к значениям и именам модели «многие ко многим» в шаблоне по имени.Может кто-нибудь показать мне, что я делаю не так.

У меня есть модель под названием IP.Эта модель может иметь несколько атрибутов.Я хочу вызвать «значение» определенного атрибута.

Например: у меня есть блок IP с именем Foo.Foo имеет атрибут «bar» со значением «удачи».

Как я могу сослаться на именованный атрибут в M2M и его значение из шаблона ??

Это работает, но YUCK !!

{% for attr in ip.attributes.all %}
  {% ifequal attr.attribute.name 'vendor' %}
    <td>{{ attr.value }}</td>
  {% endifequal %}         
{% endfor %}

Большое спасибо !!

У меня есть файл models.py, похожий на этот.Соответствующий views.py

def search(request):

    context = RequestContext(request)

    if not request.POST:
        form = { 'form' : IPSearch() }
        return render_to_response('ip_catalog/search.html', form,
                                  context_instance = context)
    else:
        form = IPSearch(request.POST)
        if form.is_valid():
            response_dict = {}
            cd = form.cleaned_data
            ips = ips.filter(**cd)                
            response_dict.update({'ips':ips})
            response_dict.update({'success': True })
            return render_to_response('ip_catalog/results.html', response_dict,
                              context_instance = context)

И, наконец, фрагмент шаблона, с которым я борюсь ..

{% for ip in ips %}
<tr>
    <td>{{ ip.name }}</td>
    <td>{{ ip.release_id }}</td>
    <td>{{ ip.release_date }}</td>

    <!-- THIS WORKS BUT THERE MUST BE A BETTER WAY! -->
    {% for attr in ip.attributes.all %}
      {% ifequal attr.attribute.name 'vendor' %}
        <td>{{ attr.value }}</td>
      {% endifequal %}         
    {% endfor %}

    <!-- THIS DOESN'T WORK! -->
    <td>{{ ip.attributes.node.value }}</td>
    <!-- OR THIS! -->
    <td>{{ ip.attribute_id.foundry }}</td>
    <!-- OR THIS.. ! -->
    <td>{{ ip.attribute.process }}</td>
</tr>
{% endfor %}

Ответы [ 2 ]

0 голосов
/ 08 июля 2014

Вы не можете сделать это хорошо в шаблонах.Это ограничено философией дизайна Django.Единственный способ сделать это - написать собственный шаблонный тег или вспомогательную функцию в модели, например get_vendor.

Оформить заказ Как выполнить фильтрацию запросов в шаблонах django

0 голосов
/ 18 февраля 2010

Доступ к ManyToManyField в модели приводит к появлению менеджера, который вы можете использовать .filter() и др. Поскольку для большинства из них требуется хотя бы один аргумент, вы не можете вызывать их в шаблоне. Вместо этого создайте тег шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...