我正在尝试使用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-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,})