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 属性和值的主要内容,如果未能解决你的问题,请参考以下文章