Python 为什么Django中的某些include需要字符串,而其他include需要变量名?

Python 为什么Django中的某些include需要字符串,而其他include需要变量名?,python,django,url,urlconf,Python,Django,Url,Urlconf,关于: 什么决定了为什么一个东西作为字符串包含,而另一个作为正则变量包含?为什么admin.site.url而不是'admin.site.url'?所有其他includes都包含为字符串。。。我在这里看不到任何逻辑模式。如果要向include()传递url()实例列表,则不使用字符串(请参阅和)。在管理员url示例中,admin.site.url指的是url实例列表。请参阅中的get_url方法(该方法提供了由admin.site.url引用的url实例列表) def get_url(self)

关于:


什么决定了为什么一个东西作为字符串包含,而另一个作为正则变量包含?为什么
admin.site.url
而不是
'admin.site.url'
?所有其他
include
s都包含为字符串。。。我在这里看不到任何逻辑模式。

如果要向include()传递url()实例列表,则不使用字符串(请参阅和)。在管理员url示例中,
admin.site.url
指的是url实例列表。请参阅中的get_url方法(该方法提供了由
admin.site.url
引用的url实例列表)

def get_url(self):
...
#管理站点范围的视图。
URL模式=[
url(r'^$',wrap(self.index),name='index'),
url(r'^login/$',self.login,name='login'),
url(r“^logout/$”,wrap(self.logout),name='logout'),
url(r“^password\u change/$”,wrap(self.password\u change,cacheable=True),name='password\u change'),
url(r“^password\u change/done/$”,换行(self.password\u change\u done,cacheable=True),
name='password\u change\u done'),
url(r'^jsi18n/$',wrap(self.i18n_javascript,cacheable=True),name='jsi18n'),
url(r'^r/(?P\d+)/(?P+)/$),换行(contenttype_views.shortcut),
name='view_on_site',
]

你是对的,这有点让人困惑。他们在Django 1.8中改变了这一点,所以现在他们只支持包含正态变量


请在中阅读更多信息。

首先,第一种模式(
'mysite.views.home'
->视图函数)在1.8中被弃用:它导致了各种各样的问题

至于其余的,它通常同时起作用
'mysite.foo.url'
解析为包含模块
mysite.foo.url
中的模式,但从mysite.foo导入URL作为foo\u URL;include(foo_url)也可以使用。基于字符串的导入主要是一个尚未删除的历史工件,但是它很方便,并且没有任何实际的缺点,因为模块是立即导入的(因此,任何
ImportError
都可以很容易地跟踪到url配置)

admin.site.url
是不同的,因为
admin.site.url
不是一个模块,但是
site
是一个对象,
url
是一个属性。因此,基于字符串的
admin.site.url导入将不起作用,您必须使用第二种方法


作为最后一点,Django书开头的警告已经过时,说它已经非常过时了。更多的最新资源,如官方文件(我所知道的最好的官方文件之一),将是最好的

必须将带有字符串的路径放入函数include()。但是admin.site.urls就像一个字符串,因为在代码开始时,您有一个来自Django 1.8文档的导入,include()可以将模块或模块名作为参数

线路

from django.contrib import admin

导入管理模块。因此,它可以直接用作include的参数。其他include()方法具有命名其他URLConf的字符串参数。

提供的链接用于引用视图,而不是一般情况下的URLConf如果我可以放两个绿色箭头,我会给你一个,你会如何调用一个视图,然后通过dj 1.8?导入视图并像
url(r'^$',view_但不是作为字符串,name='home')那样调用它。
?不包括:
from mysite.views import home。。。url(r'^$',home,name='home'),…
include()
仅用于添加嵌套在当前模式中的其他模式。
def get_urls(self):
    ...
    # Admin-site-wide views.
    urlpatterns = [
        url(r'^$', wrap(self.index), name='index'),
        url(r'^login/$', self.login, name='login'),
        url(r'^logout/$', wrap(self.logout), name='logout'),
        url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
        url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True),
            name='password_change_done'),
        url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
        url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut),
            name='view_on_site'),
    ]
from django.contrib import admin