我是Django的新手。 我正在尝试运行应用程序,我需要向管理员添加新用户。服务器正在运行。当我输入信息冷杉新用户并点击“保存”时,我收到以下错误。我正在使用django-trunk。
MessageFailure at /admin/auth/user/add/
You cannot add messages without installing
django.contrib.messages.middleware.MessageMiddleware
Request Method: POST
Request URL: http://localhost:8000/admin/auth/user/add/
Django Version: 1.6.dev20130403090717
Exception Type: MessageFailure
Exception Value: You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware
有关可能发生的事情的任何想法?
答案 0 :(得分:18)
对我来说,问题是单元测试所特有的。事实证明,某些中间件无法在某些单元测试中使用,更多信息请点击这里:
https://code.djangoproject.com/ticket/17971
在这里:
Why don't my Django unittests know that MessageMiddleware is installed?
我的解决方案是模拟这些测试的消息框架,可能有更好的解决方案(django测试客户端?)
答案 1 :(得分:10)
检查INSTALLED_APPS
中的django.contrib.messages
和MIDDLEWARE_CLASSES
中的django.contrib.messages.middleware.MessageMiddleware
是否有{{1}}。
答案 2 :(得分:4)
检查是否
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
而不是
MIDDLEWARE = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
元组名称应为MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES折旧https://docs.djangoproject.com/en/2.1/releases/1.10/#id3
答案 3 :(得分:3)
2018更新
在Django 2.0+中,设置中的名称已更改。
现在,在设置中使用MIDDLEWARE
代替列表的MIDDLEWARE_CLASSES
!
答案 4 :(得分:1)
我遇到了同样的错误。 您必须注意MIDDLEWARE_CLASSES中的中间件的顺序。 在final中插入相应的中间件。就像这样,
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
请注意订单安排。
答案 5 :(得分:1)
如果您运行的是普通的Django代码,则应添加
根据其他人的建议django.contrib.messages.middleware.MessageMiddleware
进入您的中间件
如果您正在运行测试用例并使用请求工厂,则正如上面@hwjp回答的那样,这是一个错误(无法修复)。请求工厂不会调用中间件,开发人员也无意更改此行为。
但是有一个简单的解决方案。
在测试设置文件(即settings/test.py
)中添加以下行
MESSAGE_STORAGE = 'dja ngo.contrib.messages.storage.cookie.CookieStorage'
在测试代码中,您可以编写这样的代码
request = RequestFactory().get("/")
# Add support django messaging framework
request._messages = messages.storage.default_storage(request)
就是这样。将此请求对象传递给使用django消息的任何代码都可以正常工作。
答案 6 :(得分:0)
通常将utf8_decode()
称为WSGI_request
作为request
方法的参数时,可能会出错[{1}}
答案 7 :(得分:0)
如果在测试中需要请求,可以按照@Ramast 的建议进行模拟。 我发现 the bug ticket(已关闭,无法修复)中提到的解决方案很有帮助。
from django.contrib.messages.storage.fallback import FallbackStorage
from django.test import RequestFactory
def dummy_request():
"""Dummy request for testing purposes with message support."""
request = RequestFactory().get('/')
# Add support django messaging framework
setattr(request, 'session', 'session')
setattr(request, '_messages', FallbackStorage(request))
return request