导入错误:找不到名为django_filters的模块。

48
我正在使用Django 1.7.1,并且我使用pip将django-filters安装到我的虚拟环境中的/.virtualenvs/auction2/lib/python2.7/site-packages$目录下。
它显示安装成功。
然后我将django-filters添加到已安装的应用程序中,如下所示:
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crispy_forms',
    'django_filters',
    'donations',
)

我运行了python manage.py runserver命令,然后出现了以下错误:
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/Dani/.virtualenvs/auction2/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/Users/Dani/.virtualenvs/auction2/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/Users/Dani/.virtualenvs/auction2/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/Dani/.virtualenvs/auction2/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/Users/Dani/.virtualenvs/auction2/lib/python2.7/site-packages/django/apps/config.py", line 87, in create
    module = import_module(entry)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named django_filters

它说已经安装了,但为什么无法导入呢?我还安装了另一个包,crispy-forms,并且正常运行。我查看了虚拟环境中的站点包,发现:
crispy_forms
django
django_braces-1.4.0.dist-info
django_crispy_forms-1.4.0-py2.7.egg-info
django_filters-0.1.0-py2.7.egg-info
easy_install.py
easy_install.pyc
filters
pip

看到它以 'filters' 而不是文档中建议的导入为 (django_filters),我想尝试在 installed_apps 中将其更改为 'filters'。
我停止并重新启动了 runserver,没有问题,所以我开始在 filter.py 中构建我的过滤器:
import django_filters
from donations.models import Donor, Item, Issue

class DonorFilter(django_filters.FilterSet):
    class Meta:
        model = Donor
        fields = {'type':['exact'],'donor':['icontains'],}

        def __init__(self, *args, **kwargs):
            super(DonorFilter, self).__init__(*args, **kwargs)
            self.filters['type'].extra.update(
                {'empty_label': 'All Types'})

我停止并启动了runserver,没有问题。然后我开始添加一个视图,只是在views.py中添加了导入语句。
from donations.filters import DonorFilter

给我同样的`ImportError: No module named django_filters.`错误。
我尝试将filters.py中的导入更改为filters而不是django_filters,但错误没有改变。我将所有内容都改回了django_filters(在installed_apps和filters.py中),正如文档所说,但当我添加视图时,我会得到错误`global name 'DonorFilter' is not defined`。以下是view.py的内容:
def donor_list(request):
    f = DonorFilter(request.GET, queryset=Donor.objects.all())
    return render_to_response('donations/donor_list', {'filter': f})

那就意味着我需要导入我在filters.py中创建的函数了?所以我在我的视图顶部添加from donations.filters import DonorFilter。然后出现了错误'module' object has no attribute 'FilterSet'
我可以在我的虚拟环境中安装的filters.py文件中看到FilterSet类。
我注意到django-filter有更多的开发,https://github.com/alex/django-filter页面上的版本更新到了v0.9.2,但是pip只安装了0.1.0。我应该用其他方式来安装它吗(除了pip)?

1
好的,一步一步来。有这么多错误,很难回答一个问题。首先,在你的settings.py中加入INSTALLED_APPS的应用程序'filters',并且在你的.py文件中导入filters而不是django_filter,会发生什么? - rafaelc
1
谢谢,我知道我的代码很混乱!如果我在settings.py中的INSTALLED_APPS中添加'filters'并在我的filters.py中导入'filters',那么错误就会消失。我可以访问我的应用程序,但页面上没有过滤器。筛选器的提交按钮是存在的,但其他什么都没有。 - ksi_help
1
对于其他遇到此问题的人:请确保您尝试导入的是 django_filter(注意破折号而不是下划线)。 - Jeremy Weirich
如果您使用pip3安装django,则需要使用pip3安装所有其他django库。 - Conor
11个回答

73

我的pip版本非常老,1.5.6。当我安装虚拟环境时,它可以正常工作,所以我没有质疑。这是我的教训!以下是我所做的,如果能帮助其他人就更好了...

在虚拟环境中,我按照文档描述安装了pip: https://pip.pypa.io/en/stable/installing.html python get-pip.py 这使我升级到pip 6.1.1。

pip install django-filter
pip freeze > requirements.txt

查看 requirements.txt 文件后发现我需要安装

django-filter==0.9.2
django-filters==0.1.0

所以我使用 pip uninstall django-filters 卸载了旧版本。

注意旧版本上的 s,而新版本没有 s

这是非常基础的知识,但却让我困扰了很久。感谢任何花时间研究此问题的人!


1
哇,你知道的越多。pip freeze将为我节省大量时间,直到我转向Docker。 - BastiBen

13

我也遇到了相同的问题。即使安装了django-filters,我仍然无法导入它。

ImportError: No module named django_filters

我正在使用的Django版本是1.8,Python版本是2.7.x。

解决方法是安装djangorestframework-filters

pip install djangorestframework-filters

名称非常令人困惑。

然而,django-rest-framework-filters 是 Django REST framework 和 Django filter 的扩展,使得跨关系的过滤变得容易,而 Django-filter 则是一个可重用的 Django 应用程序,允许用户通过 URL 参数声明性地添加动态 QuerySet 过滤器。


12
我也遇到了安装django-filter==2.2.0的问题。
这是我的Django版本:
Django [required: >=1.11, installed: 2.2]

settings.py:

INSTALLED_APPS = [
    # ...
    'django_filter',
]

这是正确的安装方式:
pipenv install django-filter

1
这里需要强调一下,在INSTALLED_APPS列表中是下划线(_),而在pip安装命令中是短横线(-)。对我来说似乎有所区别。 - Rishi Latchmepersad

4

我在已安装的应用程序中从django_filter更改为django_filters,没有问题。


1
但是我从 django_filters 改为使用 django_filters 后,问题就解决了。 - HERAwais

3

我曾在使用django 1.7,djangorestframework==3.2.0以及最新的django-filter==0.13.0时遇到类似问题:

Using DjangoFilterBackend, but django-filter is not installed
cannot import name Expression

我最终通过将django-filter降级至0.11来解决此问题。

现在pip freeze的结果如下,已经可以正常工作:

Django==1.7
django-filter==0.11.0
djangorestframework==3.2.0

1
我们可以使用以下命令进行安装:pip install django-filter。如果您使用的是虚拟环境(如pipenv),请使用pipenv install django-filter .
以上安装会添加最新版本的django-filter。如果您需要指定版本(例如0.11.0),请添加“==version”。
在settings.py中的app下,请确保添加了'django_filters',
INSTALLED_APPS = [
    # ...
    'django_filters',
]

1

我尝试了以上所有答案,但都没有起作用。后来我了解到pip脚本不会为python命令使用的解释器安装模块。

解决方案:

python -m pip install django-filter


0

请确保在settings.py中使用的是django_filters而不是django-filters。同时要注意,它不是django-filter,而是django-filters。 但是要安装它,请执行以下命令: pip install django-filter


0

我在设置文件 INSTALLED_APPS 中移除了 django_filters。这对我起作用了。


0
我也遇到了相同的问题,但是我意识到是因为我在虚拟环境中安装了django-filter。 我尝试在没有激活虚拟环境的同一目录下安装django-filter,它可以正常工作。
我使用了pip install django-filter。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接