代码之家  ›  专栏  ›  技术社区  ›  Bill Armstrong

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

  •  1
  • Bill Armstrong  · 技术社区  · 8 年前

    在我的 views.py 类,我试图添加一个公式,该公式使用 get_context_data() 方法这是我试过的。

    模型。py

    Class MyModel(models.Model):
        foo = models.FloatField()
        bar = models.FloatField()
    

    意见。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 错误我尝试了几种不同的方法来访问特定的object元素,但没有成功。我并没有试图注释(这是SO Q&A的绝大多数),只是使用指定对象字段中的值。

    作为旁注,如果我通过 obj 在上下文数据中,我可以轻松地迭代到模板中的元素值——因此我知道 .get() 方法运行正常——在我看来,这只是一个“简单”的数学问题,我无法工作。

    我确实找到了 this ( model_to_dict() ),但它正在扭转局面 obj 我想这可能会奏效,但似乎比我想象的要冗长得多。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Brown Bear    8 年前

    应该使用attribute,object是model类的实例,而不是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