Урегулирующая переменная Django ListView для элемента экземпляра модели - PullRequest
0 голосов
/ 25 мая 2018

В моем классе 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.Я попытался несколько разных способов доступа к конкретному элементу объекта без удачи.Я не пытаюсь комментировать (что является подавляющим большинством вопросов и ответов), просто использую значение из указанного поля объекта.

В качестве примечания, если я передам obj в данные контекста, я могу легко перейти к значению элемента в шаблоне - так что я знаю, что метод .get() работает правильно - это просто "простая "математика в представлении, я не могу добраться до работы.

Я нашел этот (model_to_dict()), но он превращает obj в словарь - я думаю, что это может сработать, но выглядит гораздо более многословно, чем я ожидал.

1 Ответ

0 голосов
/ 25 мая 2018

Вы должны использовать атрибут, объект является экземпляром класса модели, а не 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
...