【问题标题】:Django ListView settting variable to model instance elementDjango ListView 设置变量到模型实例元素
【发布时间】:2018-11-04 12:22:56
【问题描述】:

在我的views.py ListView 类中,我试图添加一个公式,该公式使用get_context_data() 方法中的对象中的特定元素。这是我尝试过的。

模型.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() 方法工作正常——这只是“简单”的数学运算在视图中我无法上班。

我确实找到了 this (model_to_dict()),但它正在将 obj 变成字典 - 我认为这可行,但似乎比我预期的要冗长得多。

【问题讨论】:

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


    【解决方案1】:

    你应该使用属性,对象是模型类的实例而不是字典

        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
    

    【讨论】:

    • 使用attribute 进行变量赋值是我一直在寻找的——它工作得很好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多