2

模型.py

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

视图.py

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

农场.html

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

如何将 map_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 存储在数据库中

4

2 回答 2

3

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

可能是这样的

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_datainfarm_data_list都将具有在您的数据类中定义的附加属性。您可以{{ farm_data.some_fn }}在模板中使用它来调用数据类上的方法。

虽然您可以使用带有字典的自定义标签,但我更喜欢使用数据类,因为当您重新访问代码时,它更容易遵循。

于 2013-10-18T08:57:54.183 回答
3

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

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

farms = list(farm_model.objects.all())
farms[0].map_top = 80
于 2013-10-18T08:54:59.970 回答