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

Posted

技术标签:

【中文标题】Django 模板 - 按名称访问 M2M 属性和值【英文标题】:Django Templates - Accessing a M2M attribute and value by name 【发布时间】:2011-01-18 11:35:22 【问题描述】:

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

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

例如: 我有一个名为 Foo 的 IP 块。 Foo 有一个属性“bar”,其值为“good lucky”。​​

如何在 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)

最后是我正在努力的模板 sn-p..

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

【问题讨论】:

How do I perform query filtering in django templates的可能重复 【参考方案1】:

你不能在模板中很好地做到这一点。这是受到 Django 设计理念的限制。 唯一的方法是在get_vendor 等模型中编写自定义模板标签或辅助函数。

结帐How do I perform query filtering in django templates

【讨论】:

【参考方案2】:

访问模型中的ManyToManyField 会生成一个管理器,您可以使用.filter() 等。由于其中大多数都需要至少一个参数,因此您不能在模板中调用它们。而是创建一个模板标签。

【讨论】:

以上是关于Django 模板 - 按名称访问 M2M 属性和值的主要内容,如果未能解决你的问题,请参考以下文章

从 django 模板访问 JSON 属性

Django - 删除 M2M 字段但保留连接表

Django - 模板对象访问详细名称

Django模型结构

在 django 中使用过滤器遍历 m2m

将关键字段访问到 Django 模板中