首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django -模板显示模型verbose_names & objects

Django -模板显示模型verbose_names & objects
EN

Stack Overflow用户
提问于 2011-09-15 22:03:33
回答 4查看 11.4K关注 0票数 8

我需要在一个模板中显示几个模型名称和对象

这是我的视图

代码语言:javascript
复制
def contents(request):
  """Lists contents"""
  objects = [
    Model1.objects.all(),
    Model2.objects.all(),
    Model3.objects.all(),
    Model4.objects.all(),
  ]
  return render_to_response('content/contents.html', objs
  , context_instance=RequestContext(request)
  )

和我的模板

代码语言:javascript
复制
{% for objs in objects %}
  <div class="content">
    <div class="title">{{ objs._meta.verbose_name }}</div>
    <ul>
    {% for obj in objs %}
      <li>{{ obj }}</li>
    {% endfor %}
    </ul>
  </div>
{% endfor %}

当然objs._meta.verbose_name不能工作

有没有一种方法可以访问这个冗长的名称,而不必为每个模型创建函数或从视图中为每个模型赋值?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-16 01:41:23

为了在模板中访问它,您可能已经注意到,Django不允许使用下划线前缀来访问模板中的属性。因此,要访问任何给定对象的详细名称,而不必在每个模型上创建模型方法,最简单的方法是只创建一个模板标记:

代码语言:javascript
复制
@register.simple_tag 
def get_verbose_name(object): 
    return object._meta.verbose_name

无关,但是您的模板中有一个错误,因为您试图访问查询集而不是对象上的_meta属性。所以你的标题行应该看起来像这样:

代码语言:javascript
复制
{% with objs|first as obj %}
    <div class="title">{% get_verbose_name obj %}</div>
{% endwith %}
票数 16
EN

Stack Overflow用户

发布于 2019-05-17 06:58:39

标签:

代码语言:javascript
复制
@register.simple_tag
def get_verbose_name(object, fieldnm): 
  return object._meta.get_field(fieldnm).verbose_name

HTML (year是我的模型中字段的名称)

代码语言:javascript
复制
<td><label class="control-label text-lg text-info"> {% get_verbose_name object 'year' %} </label></td>

多亏了上面的参考。我想分享我的发现,以防其他人正在寻找我为我的情况找到的相同的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2019-10-04 06:42:38

另一种解决方案是将模型的QuerySet子类化

代码语言:javascript
复制
class SomeQuerySet(models.QuerySet):
    @property
    def verbose_name(self):
        return self.model._meta.verbose_name

class SomeModel(models.Model):
    ...

    objects = SomeQuerySet.as_manager()

    class Meta:
        verbose_name = 'Some Model'

现在,您可以直接从查询集获取verbose_name,而无需遍历它:

代码语言:javascript
复制
<h1>{{ objects.verbose_name }}</h1>
{% for objs in objects %}
...

如果您希望直接从模型实例访问verbose_name,而不是从QuerySet访问,则还需要在模型中定义一个属性:

代码语言:javascript
复制
class SomeModel(models.Model):
    ...

    objects = SomeQuerySet.as_manager()

    class Meta:
        verbose_name = 'Some Model'

    @property
    def verbose_name(self):
        return self._meta.verbose_name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7432142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档