我无法使用django-filter来迭代MerchantGroupFilter'对象

问题描述 投票:0回答:1

我正在尝试使用django-filter建立一个简单的过滤器。我之前已经做过了,而且奏效了,因此无法确定这次出了什么问题。我得到的错误是MerchantGroupFilter' object is not iterable

models.py

class MerchantGroup(models.Model):
    created = models.DateTimeField(null=False, blank=False, default=timezone.now)
    name = models.CharField(max_length=100, null=False, blank=False)
    ledger = models.ForeignKey('journal.Ledger', on_delete=models.PROTECT, null=True, blank=True)

filters.py

import django_filters
from monzo.forms import DateTypeInput
from journal.models import Ledger
from .models import MerchantGroup
# from monzo.models import # Duplicate of the above?

class MerchantGroupFilter(django_filters.FilterSet):

    class Meta:
        model = MerchantGroup
        # Fields list needs to be present for FilterSet to work
        fields = ['ledger']

views.py

@login_required
def merchantgroups_show_all(request):
    merchant_groups = MerchantGroupFilter(request.GET, queryset=MerchantGroup.objects.all())

    #merchant_groups2 = paginator.get_page(page)
    return render(request, 'monzo/merchantgroups_show_all.html', {'merchant_groups': merchant_groups,})

追踪

Environment:


Request Method: GET
Request URL: http://localhost/monzo/merchantgroups/show/all/

Django Version: 3.0.5
Python Version: 3.8.2
Installed Applications:
['monzo',
 'rest_framework',
 'django.contrib.humanize',
 'journal',
 'adminsortable2',
 'widget_tweaks',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\Users\Philip\CodeRepos\Acacia2\templates\template.html, error at line 0
   'MerchantGroupFilter' object is not iterable
   1 : <!doctype html>
   2 : <html lang="en">
   3 :     <head>
   4 :         <!-- Required meta tags -->
   5 :         <meta charset="utf-8">
   6 :         <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   7 : 
   8 :         <!-- Basic Bootstrap CSS and Javascript -->
   9 :         <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
   10 : 


Traceback (most recent call last):
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Philip\AppData\Local\Programs\Python\Python38-32\lib\contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\monzo\views.py", line 54, in merchantgroups_show_all
    return render(request, 'monzo/merchantgroups_show_all.html', {'merchant_groups': merchant_groups,})
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\template\defaulttags.py", line 165, in render
    values = list(values)

Exception Type: TypeError at /monzo/merchantgroups/show/all/
Exception Value: 'MerchantGroupFilter' object is not iterable
django django-filter
1个回答
0
投票

发现了问题。 Django-filter将过滤后的查询集放入一个名为.qs的子查询集中。因此,当我使用return render(request, 'monzo/merchantgroups_show_all.html', {'merchant_groups': merchant_groups.qs,})时,所有工作正常。

@login_required
def merchantgroups_show_all(request):
    merchant_groups = MerchantGroupFilter(request.GET, queryset=MerchantGroup.objects.all())

    #merchant_groups2 = paginator.get_page(page)
    return render(request, 'monzo/merchantgroups_show_all.html', {'merchant_groups': merchant_groups.qs,})
© www.soinside.com 2019 - 2024. All rights reserved.