如果不安装django.contrib.messages.middleware.MessageMiddleware,则无法添加消息

use*_*563 18 django django-admin

我是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
Run Code Online (Sandbox Code Playgroud)

关于可能发生什么的任何想法?

hwj*_*wjp 22

对我来说,问题是单元测试所特有的.事实证明,某些中间件在某些单元测试中不起作用,更多信息请点击:

https://code.djangoproject.com/ticket/17971

和这里:

为什么我的Django单元测试不知道MessageMiddleware是否已安装?

我的解决方案只是模拟这些测试的消息框架,可能有更好的解决方案(django测试客户端?)


ale*_*cxe 10

检查您是否有django.contrib.messagesINSTALLED_APPSdjango.contrib.messages.middleware.MessageMiddlewareMIDDLEWARE_CLASSES.


Ram*_*ast 6

如果您正在运行普通的 django 代码,您应该django.contrib.messages.middleware.MessageMiddleware按照其他人的建议添加 到您的中间件中

如果您正在运行测试用例并使用请求工厂,那么正如上面@hwjp 所回答的那样,这是一个错误(不会修复)。请求工厂不调用中间件,开发人员不打算改变这种行为。

然而,有一个简单的解决方案。

在您的测试设置文件(即settings/test.py)中添加以下行

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
Run Code Online (Sandbox Code Playgroud)

在您的测试代码中,您可以编写这样的代码

request = RequestFactory().get("/")
# Add support  django messaging framework
request._messages = messages.storage.default_storage(request)
Run Code Online (Sandbox Code Playgroud)

就是这样。将此请求对象传递给任何使用 django 消息的代码都可以正常工作。


Moh*_*had 5

检查是否

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
Run Code Online (Sandbox Code Playgroud)

代替

MIDDLEWARE = (
   'django.middleware.common.CommonMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
)
Run Code Online (Sandbox Code Playgroud)

元组名称应为MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES已贬值https://docs.djangoproject.com/en/2.1/releases/1.10/#id3