Django模板 - 按名称访问M2M属性和值

时间:2010-02-18 19:05:13

标签: django django-templates

我试图通过名称简单地访问模板中的多对多模型的值和名称。有人能告诉我我做错了什么。

我有一个名为IP的模型。该模型可以具有多个属性。我想调用特定属性的“值”。

例如:   我有一个名为Foo的IP块。 Foo的属性为“bar”,值为“祝你好运”。

如何引用M2M中的命名属性及其来自模板的值?

这可行,但是你好!

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

2 个答案:

答案 0 :(得分:0)

访问模型中的ManyToManyField会产生一个管理员,您可以使用.filter()等。由于大多数这些参数至少需要一个参数,因此您无法在模板中调用它们。改为创建模板标记。

答案 1 :(得分:0)

您无法在模板中做得很好。这受到Django设计理念的限制。 唯一的方法是在get_vendor等模型中编写自定义模板标记或辅助函数。

结帐How do I perform query filtering in django templates