在我的views.py
类ListView中,我试图添加一个使用get_context_data()
方法中对象的特定元素的公式。这是我尝试过的。
Models.py
Class MyModel(models.Model):
foo = models.FloatField()
bar = models.FloatField()
views.py
class MyView(generic.ListView):
template_name = "my_item_list.html"
model = MyModel
def get_context_data(self, **kwargs):
obj = MyModel.objects.get(pk=this_object_id)
var_a = obj['foo']
var_b = obj['bar']
result = var_a * var_b
context = {
'result': result,
}
return context
这会引发object does not support indexing
错误。我已经尝试了几种不用运气访问特定对象元素的方法。我没有尝试注释(这是SO Q& A的绝大多数),只需使用指定对象字段中的值。
作为旁注,如果我将obj
传递给上下文数据,我可以轻松地迭代到模板中的元素值 - 所以我知道.get()
方法正常工作 - 它&#39 ;只是"简单"视图中的数学我无法开始工作。
我确实找到了this(model_to_dict()
),但它将obj
转换为字典 - 我认为这可行,但似乎比我预期的要多得多。 / p>
答案 0 :(得分:2)
你应该使用属性,object是模型类的实例而不是dict
var_a = obj.foo
var_b = obj.bar
result = var_a * var_b
并且最好是在模型的声明中创建属性:
Class MyModel(models.Model):
foo = models.FloatField()
bar = models.FloatField()
@property
def multiply_fb(self):
return self.foo * self.bar
并在视图中:
class MyView(generic.ListView):
template_name = "my_item_list.html"
model = MyModel
def get_context_data(self, **kwargs):
obj = MyModel.objects.get(pk=this_object_id)
context = {
'result': obj.multiply_fb,
}
return context