2010-02-18 2 views
0

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

У меня есть модель под названием 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, который похож на этот.

models.py 

VALID_IP_TYPES = (("hard", "Hard IP"), 
        ("soft", "Soft IP"), 
        ("verif", "Verification IP")) 

class AttributeType(models.Model): 
    name = models.CharField(max_length = 32, primary_key = True) 
    ip_type = models.CharField(max_length = 16, choices = \ 
        tuple(list(VALID_IP_TYPES) + [("all", "All IP")])) 

    def __unicode__(self): 
     return u'%s' % (self.name) 

class Attribute(models.Model): 
    attribute = models.ForeignKey(AttributeType) 
    value = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return u'%s : %s' % (self.attribute, self.value) 

class IP(models.Model): 
    ip_type = models.CharField(max_length = 16, choices = \ 
          tuple(list(VALID_IP_TYPES), 
          help_text = "Type of IP") 
    name = models.CharField(max_length = 32, help_text = "Generic Name") 
    attributes = models.ManyToManyField(Attribute) 

    def __unicode__(self): 
     return u'%s' % (self.name) 

Соответствующий 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 %} 
+0

возможно дубликат [Как выполнить фильтрацию запросов в Джанго шаблоны] (http://stackoverflow.com/questions/223990/how-do-i-perform-query-filtering-in- Джанго-шаблоны) – lqez

ответ

0

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

0

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

заказ How do I perform query filtering in django templates

Смежные вопросы