如何向 Django 模型添加额外数据以在模板中显示?

Posted

技术标签:

【中文标题】如何向 Django 模型添加额外数据以在模板中显示?【英文标题】:How to add extra data to a Django model for display in template? 【发布时间】:2013-11-14 18:01:17 【问题描述】:

我的 Django 模型:

class myModel(models.Model):
    myIntA = models.IntegerField(default=0)   

我的观点:

myModelList = myModel.objects.all()
for i in range(len(myModelList)):
    myModelList[i].myIntB = i

return render(
    request, 
    'myApp/myTemplate.html', 
    Context(
        
            "myModels": myModelList,
        
    )
)

以上合法吗?您可以看到我为每个 myModel 对象添加了一个变量 myIntB。 但是,当我尝试在下面的模板中打印 myIntB 时,什么也没有出现。 如何从模板访问 myIntB?这不是我为这个模型定义的字段,我也不希望它是。我只是希望在渲染这个特定模板期间使用这个额外的变量来扩充 myModel。

我的模板:

        % for currModel in myModels %
            currModel.myIntA<br/>
            currModel.myIntB<br/>
        % endfor %        

【问题讨论】:

【参考方案1】:

替换以下行:

myModelList = myModel.objects.all()

与:

myModelList = list(myModel.objects.all())

否则每次访问myModelList[i]时都会执行新的查询;您会丢失所做的更改。


或者,你想要的只是计数器,你可以在模板中使用forloop.counterforloop.counter0

【讨论】:

【参考方案2】:

不,那不会像你想的那样做;试试这个:

enriched_models = []
myModelList = myModel.objects.all()
for i in myModelList:
    enriched_models.append((i, 'foo'))

return render(request, 'myApp/myTemplate.html', "myModels": enriched_models)

然后在你的模板中:

% for currModel,extra in myModels %
    currModel.myIntA <br/>
    extra <br/>
% endfor %      

【讨论】:

好的。这是有道理的。谢谢!但是,我认为有一个复杂因素使我无法使用您的解决方案。我的模型实际上是一个 MPTT 树结构:class myModel(MPTTModel)。我想为这个模板丰富这个树结构的每个元素,并使用 % recursetree % 递归通过丰富的对象。所以我不认为用元组替换每个列表元素会在这里解决问题(尽管老实说我没有尝试过)。您能否建议我如何丰富 MPTT 对象列表,以免破坏它们的层次关系? 在此处查看修改后的问题:***.com/questions/19763241/…

以上是关于如何向 Django 模型添加额外数据以在模板中显示?的主要内容,如果未能解决你的问题,请参考以下文章

Django模型加入一对多关系以在模板中显示

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

如何在 Django 中显式重置模板片段缓存?

向 createGroup( ) 添加额外信息以在 discoveryPeers( ) 中使用

id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?

如何在 Django 中向 ModelForm 添加非模型字段?