【问题标题】:How can I redirect in django middleware? global name 'view' is not defined如何在 django 中间件中重定向?未定义全局名称“视图”
【发布时间】:2025-12-12 11:00:02
【问题描述】:

这里是Django新手,如果某个模型字段为空,则需要基本中间件的帮助才能重定向到另一个视图。

我正在创建一个协议条款页面,如果他们的 Profile 模型上的 filed_terms 字段为空,用户必须在他们注册到平台后立即被重定向到该页面。

我为此使用中间件。但是我无法让它工作。这是我的中间件类:

class TermsMiddleware(object):

    def process_request(self, request):

        if request.user.profile.filled_terms is None:
            return redirect(reverse(terms)) 

这给了我以下错误:

global name 'terms' is not defined

当我手动导航到它时,我也有完美工作的 url 匹配器:

url(r'^terms/', 'my_app.views.terms')

我的views.py 文件中有一个terms.html 模板和一个terms 视图,在所有其他方面都运行良好。我还将它添加到设置中间件要求中以确保它加载。

我是否必须将视图或 url 调度程序中的某些内容导入到我的中间件文件中?如果是这样,那会是什么?我已经有一段时间了,找不到任何有用的东西。

【问题讨论】:

    标签: python django middleware django-middleware


    【解决方案1】:

    reverse 函数在正则表达式上采用 url 名称。所以你需要在你的url 配置中添加name。这是一个例子。

    url(r'^terms/', 'my_app.views.terms', name='terms')
    

    将此添加到您的views.py

    from django.core.urlresolvers import reverse
    

    并且你需要将你的反向函数修复为。

    return redirect(reverse('terms'))
    

    Python 将您的 terms 解释为一个变量,并且您没有名为 terms 的变量,而您需要将字符串放在 reverse 上。

    【讨论】:

    • 因为当您手动访问 url 时,它将在 url 上使用您的正则表达式,而 reverse 将使用 name。您可以通过将reverse 删除到return redirect('terms') 中来使您的代码工作
    • 当我尝试您的解决方案时,我只会永远被重定向到条款。我认为这是一个不会停止的术语的循环。
    • 如果是这样的话,我认为问题出在另一个背景上。关键是路由已经有效。随时提交另一个问题。
    • 现在是from django.urls import reverse,而不是from django.core.urlresolvers import reverse