Django 2.1--在ListView中显示meta中的模型详细名称

Django 2.1--在ListView中显示meta中的模型详细名称,django,django-models,django-templates,django-views,Django,Django Models,Django Templates,Django Views,第一段代码工作正常;仅供参考 #Basic Model class MyTestModel(models.Model): record = models.CharField(max_length=100) def __str__(self): return self.record #Specify verbose_name class Meta: verbose_name = 'UniqueNameExample'

第一段代码工作正常;仅供参考

#Basic Model
class MyTestModel(models.Model):
    record = models.CharField(max_length=100)

    def __str__(self):
        return self.record

    #Specify verbose_name
    class Meta:
        verbose_name = 'UniqueNameExample'
        verbose_name_plural = verbose_name


#Generic ListView.
class MyTemplateView(ListView):
    model = MyTestModel
    template_name = 'base.html'
    context_object_name = 'model_list'
    ordering = ['record']



#Python block in HTML template. So far, so good. 
{% for item in model_list %}
    {{ item.record }}<br>
    #{{ item }} also works
{% endfor %}
然后

{% load verbose %}
在我的HTML(也可以正常工作)中,我将尝试以下内容:

{{ object|verbose_name }}
我将得到错误'str'对象没有属性'u meta'。如果使用标记,则错误相同:

{% verbose_name object %}
注意:标签显然适用于早期版本,但可能我使用不正确?不要求访问“record”的模型字段verbose_name,顺便说一句——这已经得到了充分的回答

我尝试过的一件事是,如果我在MyTemplateView下设置了以下内容,那么答案就对半了:

queryset = model._meta.verbose_name 
问题是它覆盖了model_列表,剩下的唯一结果是“uniquenamexample”,无法访问我在模型中使用的记录

我知道private=True表示_meta(不确定这是否相关或是否值得研究/可能会被破坏),但Django admin在创建的模型列表中显示了详细的_名称(如果已设置),因此我不明白为什么我不能这样做(也很难准确地追溯它在源代码中是如何做到的)。也许它不是一个普通的ListView,而是一个MixIn?基于功能


大型(ish)db,有数千个模型,每个模型都有唯一的详细名称;我非常希望保持简单

编辑:从多米尼克·巴顿那里找到了一个绝妙的解决方案@

首先,在应用程序级别创建templatags文件夹,并用init文件填充。接下来,创建一个模板标记文件。比如verbose.py

from django import template
register = template.Library()

@register.simple_tag
def verbose_name(value):
#Django template filter which returns the verbose name of a model.
#Note: I set my verbose_name the same as the plural, so I only need one tag. 
    if hasattr(value, 'model'):
        value = value.model
    return value._meta.verbose_name
接下来,应该修改ListView

from django.views.generic.list import ListView as DjangoListView
from .models import MyTestModel


class ListView(DjangoListView):
    #Enhanced ListView which includes the `model` in the context data,
    #so that the template has access to its model class.
    #Set normally
    model = MyTestModel
    template_name = 'base.html'
    context_object_name = 'model_list'
    ordering = ['record']

    def get_context_data(self):
        #Adds the model to the context data.
        context = super(ListView, self).get_context_data()
        context['model'] = self.model
        return context
不要忘记将路径添加到URL.py:

path('your_extension/', views.ListView.as_view(), name='base')
最后,加载标记并正常遍历“记录”:

{% load verbose %}


<h1> {% verbose_name model%} </h1>

<ul style='list-style:none'>
{% for item in model_list %}
    <li>{{ item }}}</a></li> 
{% endfor %}
</ul>
{%load verbose%}
{%verbose_name model%}
    {模型_列表%中的项的百分比}
  • {{item}}}
  • {%endfor%}

分页也可以像广告宣传的那样工作

与直接在上下文中添加想要的字符串相比,使用简单的_标记有什么好处吗?
{% load verbose %}


<h1> {% verbose_name model%} </h1>

<ul style='list-style:none'>
{% for item in model_list %}
    <li>{{ item }}}</a></li> 
{% endfor %}
</ul>