代码的第一部分工作正常;仅供参考。
#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 %}
我试图在视图中访问模型的verbose_name('UniqueNameExample')和model_list。我尝试注册过滤器,标签和simple_tag。
类似的东西:templatetags / verbose.py
from django import template
register = template.Library()
@register.filter (or @register.tag or @register.simple_tag)
def verbose_name(obj):
#Could be verbose_name(model) or whatever input
return obj._meta.verbose_name
然后
{% load verbose %}
在我的HTML(也可以正常工作)中,我将尝试以下操作:
{{ object|verbose_name }}
我会得到错误的“ str”对象没有属性“ _meta”。如果使用标签,则错误相同:
{% verbose_name object %}
注意:标记显然适用于早期版本,但也许我没有正确使用它们?顺便说一句,不要求访问“记录”的“模型”字段verbose_name,顺便说一句。
我尝试获得正确答案的一件事是,如果我在MyTemplateView下设置以下内容:
queryset = model._meta.verbose_name
此问题是它覆盖了model_list,而我留下的唯一结果是“ UniqueNameExample”,而无法访问我在模型中使用的记录。
我知道private = True for _meta(不确定是否相关或值得探索/可能打破),但是Django Django管理员在创建的模型列表中显示verbose_name(如果已设置),所以我不知道为什么不会做同样的事情(也很难在源代码中追溯它的工作方式)。也许它不是通用的ListView而是MixIn?基于功能?
具有数以千计的模型的大型(ish)数据库,每个模型都有唯一的verbose_name [s];非常想保持简单。
答案 0 :(得分:0)
编辑:从Dominique Barton @ https://blog.confirm.ch/accessing-models-verbose-names-django-templates/
中找到了一个很棒的解决方案首先,在应用程序级别创建一个templatags文件夹,并填充一个初始化文件。接下来,创建一个模板标签文件。像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
不要忘记将路径添加到urls.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>
分页也可以像宣传的那样工作。