Django ListView将变量设置为模型实例元素

时间:2018-05-25 07:14:46

标签: python django python-3.x django-views

在我的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 ;只是"简单"视图中的数学我无法开始工作。

我确实找到了thismodel_to_dict()),但它将obj转换为字典 - 我认为这可行,但似乎比我预期的要多得多。 / p>

1 个答案:

答案 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