【问题标题】:Unique HTML element IDs for each model with Django使用 Django 的每个模型的唯一 HTML 元素 ID
【发布时间】: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?

标签: python html django django-forms django-templates


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多