Django:不推荐使用对 url() 的字符串视图参数的支持,并将在 Django 1.10 中删除

Posted

技术标签:

【中文标题】Django:不推荐使用对 url() 的字符串视图参数的支持,并将在 Django 1.10 中删除【英文标题】:Django: Support for string view arguments to url() is deprecated and will be removed in Django 1.10 【发布时间】:2016-03-09 20:42:50 【问题描述】:

新的 python/Django 用户(对 SO 来说确实是新用户):

在尝试迁移我的 Django 项目时,我收到一个错误:

RemovedInDjango110Warning: Support for string view arguments to url() is deprecated 
and will be removed in Django 1.10 (got main.views.home). Pass the callable instead.   
url(r'^$', 'main.views.home')

显然第二个参数不能再是字符串了。我是通过pluralsight.com上的教程来创建这段代码的,该教程教授如何将Django与以前的版本一起使用(我目前正在使用1.9)。老师指导我们根据我们在应用程序中创建的视图在 urls.py 中创建 urlpatterns。他教我们创建一个 urlpattern,如下所示:

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', 'main.views.home')
]

参考

def home(request):
    return render(request, "main/home.html",
                    'message': 'You\'ve met with a terrible fate, haven\'t you?') #this message calls HTML, not shown, not important for question

在我创建的应用程序“main”的 views.py 中。

如果不推荐使用此方法,我如何将视图参数不作为字符串传递?如果我只是删除引号,如文档 (https://docs.djangoproject.com/en/1.9/topics/http/urls/) 中所示,我会收到错误消息:

NameError: name 'main' is not defined

我尝试使用本文档中提供的代码“导入”视图或主视图:

from . import views

from . import main

这给了我:

ImportError: cannot import name 'views'

ImportError: cannot import name 'main'

我相信我已将其归结为导入错误,目前正在对此进行研究。

【问题讨论】:

欢迎堆栈溢出。 Django 在某一时刻改变了布局。我认为您希望从主要导入视图中获取,但不确定...您可以试试吗? 是的,我也检查了该方法,它的工作方式如下:如果使用“来自主导入视图”,那么您的 url 参数需要是 'url(...,views. home)' ,而不是 'url(..., main.views.home)' @joey wilhelm 在下面说明了这一点 【参考方案1】:

我找到了我的问题的答案。这确实是一个导入错误。对于 Django 1.10,您现在必须导入应用程序的 view.py,然后传递不带引号的 url() 的第二个参数。这是我现在在 urls.py 中的代码:

from django.conf.urls import url
from django.contrib import admin
import main.views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', main.views.home)
]

我没有更改应用程序或 view.py 文件中的任何内容。

@Rik Poggi 的道具说明了如何在他对这个问题的回答中导入: Django - Import views from separate apps

【讨论】:

完全披露,在发布之前我已经找到了问题的答案。我想把它贴出来,这样其他人就不必进行同样的追逐。这是我第一次发布问题,如果这不是分享信息的最佳方式,请告知我更好的方式。 如果您已经回答了自己的问题,请将您的答案标记为解决方案。 感谢您的注意,但我似乎在发布后 2 天内无法接受我自己的答案作为解决方案。 帮了我,我也跟着一个教程来学习Django【参考方案2】:

您应该能够使用以下内容:

from django.conf.urls import url
from django.contrib import admin

from main import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.home)
]

我不确定您的目录结构是什么样的,但使用 from . import X 等相对导入适用于文件彼此位于同一文件夹中的情况。

【讨论】:

是的!似乎这也可以。我确实更喜欢“import main.views”然后调用 url(..., main.views.home) 与“从主导入视图”和调用 url(...,views.home) 因为我可以保留视图一旦我有多个应用程序就占了。【参考方案3】:

您可以通过将所有函数导入列表并将每个函数添加到 urlpatterns 来使用您的函数。

from django.conf.urls import url
from django.contrib import admin

from main.views import(
   home,
   function2,
   function3,
)

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^home/$', home),

   url(r'function2/^$', function2),
   url(r'^$', function3),
]

【讨论】:

现在是否允许使用方括号 [] 进行导入,您的意思是使用 () 为什么要为完全相同的 URL 模式添加多个视图?根据文档docs.djangoproject.com/en/3.1/topics/http/urls:“3. Django 按顺序遍历每个 URL 模式,并在第一个匹配请求的 URL 时停止,与 path_info 匹配。”。我不确定 2016 年的最新版本是否已经是这种情况,但只要我使用 Django,它就会停止在第一个匹配模式。 @MichaelS。你是对的,我已经纠正了。

以上是关于Django:不推荐使用对 url() 的字符串视图参数的支持,并将在 Django 1.10 中删除的主要内容,如果未能解决你的问题,请参考以下文章

Django URL中r的意思

django-paypal 弃用错误:不推荐使用初始 ['return_url']

如何将命名空间 url 添加到 django-rest-framework 路由器视图集

使用Django Rest Framework中的APIClient帖子测试多个文件上传到模型视图集

如何在不使用视图集的情况下序列化 Django 中的注释字段?

django–url