使用 Django 的每个模型的唯一 HTML 元素 ID
Posted
技术标签:
【中文标题】使用 Django 的每个模型的唯一 HTML 元素 ID【英文标题】:Unique HTML element IDs for each model with Django 【发布时间】:2013-05-31 08:56:54 【问题描述】:我使用复选框输入在页面上显示 django 模型,该输入框上面有一个标签,如下所示:
% if recipes_list %
<table>
% for r in recipes_list %
<tr>
<td>
<section class="ac-container">
<div>
<input id="ac-1" type="checkbox" />
<label for="ac-1">r.name</label>
<article class="ac-small">
<ul>
% for i in r.ingredient_list%
<li>i.part, i.amount</li>
% endfor %
</ul>
</article>
</div>
</section>
</td>
</tr>
% endfor %
</table>
当我点击recipes_list
中每个条目的标签时,显然总是打开第一个条目的文章。在过去的几天里,我一直在寻找有关如何在 html 中为每个模型条目提供唯一 ID 的解决方案,但我找不到任何适用于这种情况的方法。我尝试过表单、模型表单、各种 javascript 和 php。我该怎么做?
【问题讨论】:
你想给什么标签元素提供唯一的ID? 【参考方案1】:您可以使用forloop.counter 来实现:
% if recipes_list %
<table>
% for r in recipes_list %
<tr>
<td>
<section class="ac-container">
<div>
<input id="ac-forloop.counter" type="checkbox" />
<label for="ac-forloop.counter">r.name</label>
<article id="article-forloop.counter" class="ac-small">
<ul>
% for i in r.ingredient_list%
<li>i.part, i.amount</li>
% endfor %
</ul>
</article>
</div>
</section>
</td>
</tr>
% endfor %
</table>
希望这会有所帮助!
【讨论】:
我不知道您可以在 for 循环中访问计数器。这也是我寻找的第一件事! 可以,也可以访问父循环计数器。看看内置的模板标签文档,你会在那里找到有用的东西:)【参考方案2】:您可以编写一个过滤器来获取模型名称
from django import template
register = template.Library()
@register.filter(name='class_name')
def class_name(obj):
return obj.__class__.__name__
在模板中:
在模板中,无论你想要什么 id/classname:
<article id=obj|class_name>
# further code #
</article>
或
class MyModel(models.Model):
#fields
def class_name(self):
return "%s"%self.__class__.__name__ #returns the model instance name
如果要返回实例名:
from django.template.defaultfilters import slugify
class MyModel(models.Model):
def class_name(self):
return "%s"%(slugify(self.name)) #or whatever field has the specific instance name
在模板中:
obj.class_name
【讨论】:
这似乎只返回模型类的名称(在该示例中为“MyModel”)。至少对于我正在寻找的东西,我想要模型实例名称。【参考方案3】:它的简单使用对象主键作为 id 因为它是唯一的(除非你有另一个模型的另一个循环):
% for r in recipes_list %
<input id="ac- r.id " type="checkbox" />
% endfor %
或者使用forloop.counter
:
% for r in recipes_list %
<input id="ac- forloop.counter " type="checkbox" />
% endfor %
【讨论】:
这很好用,但我喜欢 karthik 的回答,您可以根据模型实例名称为每个元素获得一个明确、有用的 id。以上是关于使用 Django 的每个模型的唯一 HTML 元素 ID的主要内容,如果未能解决你的问题,请参考以下文章
Django 10 模型层 model 元信息,对象优化查询,自定义group_concat,基于jq的ajex异步请求