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-paypal 弃用错误:不推荐使用初始 ['return_url']
如何将命名空间 url 添加到 django-rest-framework 路由器视图集
使用Django Rest Framework中的APIClient帖子测试多个文件上传到模型视图集