当同一个项目中有多个应用程序时,如何在 django 中设置 url?

use*_*853 7 python django url

我是 Django 的新手。我正在尝试设置 URL。我在“mysite”项目下有 2 个应用程序。在 mysite 的 urls.py 中,我包含了来自 2 个应用程序(称为“登录”和“组织”)的网址

我的网站/urls.py

urlpatterns = [
    url(r'^login/', include('login.urls')),
    url(r'^org/', include('org.urls')),
]
Run Code Online (Sandbox Code Playgroud)

登录/ urls.py

app_name = 'login'
urlpatterns = [
    url(r'^signup/$', login_views.signup, name='signup'),
]
Run Code Online (Sandbox Code Playgroud)

组织/网址.py

app_name = 'org'
urlpatterns = [
    url(r'^organizations/add/$', views.addorg, name='addorg'),
]
Run Code Online (Sandbox Code Playgroud)

以这种方式设置后,我的站点 URL 如下所示:

site.com/login/login/signup
site.com/org/organizations/add
Run Code Online (Sandbox Code Playgroud)

我希望这些 URL 如下所示。

site.com/login/signup
site.com/organizations/add
Run Code Online (Sandbox Code Playgroud)

我如何让“包含”起作用?如果我将 mysite/urls.py 更改为以下内容,它会起作用吗?

urlpatterns = [
    url(r'^$', include('login.urls')),
    url(r'^$', include('org.urls')),
]
Run Code Online (Sandbox Code Playgroud)

当有多个应用程序时,有没有更好的方法来设置 URL?

谢谢

sch*_*ggl 5

在您描述的设置中,登录网址不是'site.com/login/login/signup',而是'site.com/login/signup'。第二个从哪里来'login/'

您建议的解决方案,

urlpatterns = [
    url(r'^$', include('login.urls')),
    url(r'^$', include('org.urls')),
]
Run Code Online (Sandbox Code Playgroud)

如果两个应用程序中没有相同的 url,通常会起作用。但这并不理想,因为登录 ur 中的所有模式都将不必要地针对所有请求进行尝试。

因此,您可能需要考虑删除specific_app.urls内部前缀,特别是当这些前缀对于应用程序的所有视图都相同时。将其留给将要使用该应用程序的用户并将其包含在他们想要包含该应用程序的路径下(此处:mysite.urls)。

# login/urls.py
urlpatterns = [
    # no 'login' prefix here. Includers know which app 
    # they are including and how they want do that.
    url(r'^signup/$', login_views.signup, name='signup'),  
]

# org/urls.py
urlpatterns = [
    # same: no 'org' prefix
    url(r'^add/$', views.addorg, name='addorg'),
]

# mysite.urls.py
urlpatterns = [
    url(r'^login/$', include('login.urls')),
    url(r'^organizations/$', include('org.urls')),
]
Run Code Online (Sandbox Code Playgroud)

生成的网址将是:

site.com/login/signup
site.com/organizations/add
Run Code Online (Sandbox Code Playgroud)