【问题标题】:How to add extra data to a Django model for display in template?如何向 Django 模型添加额外数据以在模板中显示?
【发布时间】: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 %}        

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案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 对象列表,以免破坏它们的层次关系?
      • 在此处查看修改后的问题:stackoverflow.com/questions/19763241/…
      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 2018-10-21
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多