Django在渲染模板之前修改queryset值

时间:2019-04-03 13:13:03

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

我有一个FormView,它将数据发送到ListView
LisView中,我用self.request.GET获得了数据,并取消了qustom过滤器的使用,从而获得了所需的查询集。 现在,我需要修改查询集中的一些值,但找不到方法。

尝试使用ListViewqueriset['name']来索引queryset[1]中的查询队列,但是它告诉我索引没有被支持。
尝试应用queryset.values_list()queriset.values()然后进行索引,但结果相同。
试图在ListView中创建一个函数并应用到模板中,提示“无法解析提醒”。
最后尝试通过执行object.value-request.GET.value将模板中的值保留下来,但出现此错误:
Could not parse the remainder: ' - request.GET.salary' from 'item.smg70 - request.GET.salary'

views.py

class QuoteListView(ListView):
    model = SmgQuotesTable

    def get_queryset(self):
        r_get = self.request.GET
        d_get = {'name': None , 'email':None , 'couple': None, 'age': None, 'kids':None , 'salary':None}

        for value in d_get:
            d_get[value] = r_get[value]

        query_filter = Quotes().planSelector(d_get['couple'], d_get['kids'], d_get['age'])
        queryset = super(QuoteListView, self).get_queryset().filter(composite=query_filter)

        for i in queryset[1:]:
            i - d_get['salary']
            print(i)


        return queryset


    def salary(self, x):
        salary_get = self.request.GET('salary')

        return x - salary_get

smgquotestable_list.html

{% for item in object_list %}
<div class="table-responsive text-nowrap"></div>
  <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col"></th>
          <th scope="col">SMG01</th>
          <th scope="col">SMG02</th>
          <th scope="col">SMG10</th>
          <th scope="col">SMG20</th>
          <th scope="col">SMG30</th>
          <th scope="col">SMG40</th>
          <th scope="col">SMG50</th>
          <th scope="col">SMG60</th>
          <th scope="col">SMG70</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">{{ item.composite }}</th>
          <td>$ {{ item.smg01 }}</td>
          <td>$ {{ item.smg02 }}</td>
          <td>$ {{ item.smg10 }}</td>
          <td>$ {{ item.smg20 }}</td>
          <td>$ {{ item.smg30 }}</td>
          <td>$ {{ item.smg40 }}</td>
          <td>$ {{ item.smg50 }}</td>
          <td>$ {{ item.smg60 }}</td>
          <td>$ {{ item.smg70 }}</td>
        </tr>
      </tbody>
  </table>
</div>
{% endfor %}

我需要将表单发送的薪水值保留为在查询集中获得的smg01等值。

3 个答案:

答案 0 :(得分:0)

您还可以在queryset上使用update或按照dirkgroten所述进行迭代

答案 1 :(得分:0)

您不会共享一些东西,例如SmgQuotesTable的模型字段或Quote和planSelector的代码。但是,假设您尝试使用在self.request对象中获得的值(例如,名称,电子邮件,一对等的值)过滤结果,并假定这些实际上是SmgQuotesTable的字段,则应按照常规方式进行操作(请参见the docs)。另外,请注意,您无需在get_queryset中调用Super。您可能会将它与get_context_data混淆

您需要调用super来获取上下文。

class QuoteListView(ListView):
    model = SmgQuotesTable

    def get_queryset(self):
        r_get = self.request.GET
        d_get = {'name': None , 'email':None , 'couple': None, 'age': None, 'kids':None , 'salary':None}

        for value in d_get:
            d_get[value] = r_get[value]  # I do NOT know what you are doing here, so I am going by your code

        filtered_quotes = SmgQuotesTable.objects.filter(**d_get)

        return filtered_quotes

答案 2 :(得分:0)

我的错误不是因为dirkgroten告诉我,我是对象的一个​​实例。 所以我需要做i.value来使用acces的值。

这是我的解决方法:

quotes.py中,我编写了一个名为salaryDiscount的函数,该函数可修改运行时的值:

    def salaryDiscount(self, queryset, salary):
        '''
        This function apply the salary discount to all the values for this person. 
        '''
        salary = float(salary) * 0.03  # Take the salary, and aply the part that could be discounted

        for i in queryset:  # Get the object of the queryset
            i.smg01 = round(i.smg01  - salary, 2)    # Use the object edit the values on the fly
            i.smg02 = round(i.smg02  - salary, 2)
            i.smg10 = round(i.smg10  - salary, 2)
            i.smg20 = round(i.smg20  - salary, 2)
            i.smg30 = round(i.smg30  - salary, 2)
            i.smg40 = round(i.smg40  - salary, 2)
            i.smg50 = round(i.smg50  - salary, 2)
            i.smg60 = round(i.smg60  - salary, 2)
            i.smg70 = round(i.smg70  - salary, 2)

        return queryset   # Return the queryset edited. 

然后在get_queryset的{​​{1}}上调用它,在其中修改查询集:

ListView