我有一种情况,我希望遍历数据库中可用的所有表(存储在models.py
中)并仅为django html模板中具有此属性的表打印元属性verbose_name
。这样用户就可以选择他想要查看的表格了。
我尝试了一些方法,但似乎都没有。
这是我的代码: -
def tables_select(request):
if request.user.is_authenticated():
mdls = models.get_models(include_auto_created=False)
tables_list = [mdl._meta.verbose_name for mdl in mdls]
return render(request, 'cbm/tables_select.html', {'tables_list': tables_list})
else :
...
使用hasattr()
方法进行的检查无效:
for mdl in mdls:
if (hasattr(mdl._meta, 'verbose_name')):
tables_list.append(mdl._meta.verbose_name)
对于没有verbose_name
参数的表,它们都返回实际的db表名。
更新:这些是models.py
中的2个模型定义:
这是主表
class Ai(models.Model):
id = models.AutoField(db_column='ID', primary_key=True)
well = models.ForeignKey('Well', db_column='Well_ID')
samplename = models.CharField(db_column='sampleName', max_length=40, blank=True)
startdepth = models.FloatField(db_column='startDepth', blank=True, null=True)
... # Plus some other Columns
def __unicode__(self):
return self.samplename
class Meta:
managed = False
db_table = 'ai'
verbose_name = "Adsorbtion Isotherm"
AichIo
是Ai
class Aich4Io(models.Model):
id = models.AutoField(db_column='ID', primary_key=True)
ai = models.ForeignKey(Ai, db_column='AI_ID')
pressurekpa = models.IntegerField(db_column='pressureKPa', blank=True, null=True)
pressureatm = models.FloatField(db_column='pressureAtm', blank=True, null=True)
meccreported = models.FloatField(db_column='meccReported', blank=True, null=True)
dafccreported = models.FloatField(db_column='dafccReported', blank=True, null=True)
class Meta:
managed = False
db_table = 'aich4io'
我不希望打印从属表的名称。 但是对于我的html模板:
{% for table in tables_list %}
{{ table }}<br>
{% endfor %}
输出结果为:
Adsorbtion Isotherm
aich4 io
答案 0 :(得分:1)
经过多次研究/组合能够发现这是django的一般行为。
对于没有verbose_name
参数的模型,表/模型名称将作为字符串返回。
为了实现我的目标,我为我不想显示verbose_name = 'DNS'
的模型添加了verbose_name
。在我的代码中,我做了类似的事情:
if mdl._meta.verbose_name == 'DNS':
# Do Nothing
else:
# My Logic.
答案 1 :(得分:0)
您可以查看详细名称的类型。如果它是unicode,那么你可以打印名称
mdls = models.get_models(include_auto_created=False)
for mdl in mdls:
if isinstance(mdl._meta.verbose_name, unicode):
print mdl._meta.verbose_name