从django模板访问dict / object

时间:2013-10-18 08:25:53

标签: python django django-models django-templates

models.py

class farm_model(models.Model):
  name=models.CharField(max_length=30)

views.py

def farms(request):
farms=farm_model.objects.all()
context = { 'farms': farms }
return render(request, 'farms.html', context)

farms.html

{% for farm in farms %}
<div style="top: {{ farm.map_top }}px; left: {{ farm.map_left }}px;">{{ farm.name }}</div>

如何将views_top和map_left添加到来自views.py的场对象? 我试过了

farms[0].map_top=80
setattr(farms[0],'map_top',80)

但它不起作用

我的第二个方法是在views.py中设置

farm_web_data={}
farm_web_data[1]={}
farm_web_data[1]['map_top']=80

但我不知道如何从模板

访问这些数组
{% for farm in farms %}
<div style="top: {{ farm_web_data.{{ farm.pk }}.map_top }}px;

不工作

任何想法? 我不想将map_top存储在DB

2 个答案:

答案 0 :(得分:2)

第一次尝试的问题是切片查询集 - 就像使用farms[0]一样 - 总是命中数据库并获得一个新的实例。也就是说,farms[0]引用的对象与稍后再次遍历查询集时获得的对象不同。

答案是立即将查询集转换为列表:然后您可以在实例上设置属性,后续访问将引用相同的实例。

farms = list(farm_model.objects.all())
farms[0].map_top = 80

答案 1 :(得分:2)

听起来您正在尝试扩展模型以包含模板的更多信息。您可以创建一个数据对象来表示它。这是创建封装实际模型的数据类的常见模式。您甚至可以在数据类中使用可以在模板中调用的方法来执行更复杂的操作。

可能类似于

class FarmData(object):
    def __init__(self, farm, map_top, map_left):
        self.name = farm.name
        self.map_top = map_top
        self.map_left = map_left

    def some_fn(self):
        return some_output

在您的views.py中,您可以执行类似

的操作
farms = farm_model.objects.all()
farm_data_list = []
for farm in farms:
    farm_data = FarmData(farm, map_top, map_left) # I don't know how you are defining map data
    farm_data_list.append(farm_data)

context = { 'farms': farm_data_list }

在您的模板中,farm_data中的每个farm_data_list都会在您的数据类中定义其他属性。您可以在模板中使用{{ farm_data.some_fn }}来调用数据类中的方法。

虽然您可以沿着使用带字典的自定义标记的路线,但我更喜欢使用数据类,因为在您重新访问代码时更容易跟进。