Django:url()函数中支持字符串视图参数的功能已被弃用,将在Django 1.10中移除。

28

我是一名新的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'

我相信我已经追踪到了一个导入错误,并正在进行研究。


欢迎来到 Stack Overflow。在某个时候,Django 稍微改变了布局。我 认为 你想导入 main 的views,但不能确定...你可以尝试一下吗? - Foon
是的,我也检查了那个方法,并且它以以下方式工作:如果使用“from main import views”,则您的url参数需要是“url(...,views.home)”,而不是“url(...,main.views.home)”如下所示joey wilhelm进行了说明 - AMadinger
3个回答

50

我已经找到了我的问题的答案。确实是一个导入错误。对于Django 1.10,现在您需要导入app的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 - 从不同的应用程序导入视图


1
完全透露,我在发布问题之前已经找到了答案。我想发帖是为了让其他人不必进行同样的搜索。这是我第一次发帖提问,如果这不是分享信息的最佳方法,请告诉我更好的方式。 - AMadinger
如果您已经解决了自己的问题,请将您的答案标记为解决方案。 - qasimalbaqali
谢谢您的留言,但是似乎我在发布答案后的两天内无法将自己的答案作为解决方案接受。 - AMadinger
帮了我,我正在跟着教程学习Django。 - Fauxpas

8

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

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) 而不是使用 "from main import views" 并调用 url(..., views.home),因为一旦我有多个应用程序,我可以让视图保持记录。 - AMadinger

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),
]

现在的导入语句里面允许使用方括号 [] 了吗?你是不是想使用小括号 () - Moses Koledoye
为什么要为完全相同的URL模式添加多个视图?根据文档 https://docs.djangoproject.com/en/3.1/topics/http/urls/ : “3. Django按顺序运行每个URL模式,并在匹配path_info时停止第一个匹配请求的URL。”我不确定这是否已经是2016年当前版本的情况,但只要我使用Django,它就会停止在第一个匹配模式处。 - Michael S.
@MichaelS。你说得对,我已经纠正了。 - Harun ERGUL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接