在Django&#39的Model.py中循环和打印所有表的Verbose_Name

时间:2014-06-06 06:28:41

标签: python django for-loop django-models

我有一种情况,我希望遍历数据库中可用的所有表(存储在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"

AichIoAi

上的附属表
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

2 个答案:

答案 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