【问题标题】:How to setup path (urls) for multiple Django applications in a single Django project如何在单个 Django 项目中为多个 Django 应用程序设置路径(url)
【发布时间】:2019-10-27 20:47:26
【问题描述】:

我有一个 Django 项目,它有两个不同的 Django 应用程序,MyApp1 和 MyApp2(更改了它们的名称)。

结构是这样的:

MyProject
   MyApp1
      static
      templates
      urls.py
      views.py
      ...
   MyProject
      settings.py
      urls.py
      ...

我将 MyApp2 作为一个单独的应用程序编写在不同的 Django 项目中,并将其与 MyProject 项目集成(pip install MyApp2)。这是settings.py文件中安装的应用程序:

# Application definition
INSTALLED_APPS = [
    'MyApp1',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'MyApp2',
]

这些是 MyProject 的以下路径 (urls.py)。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp1/', include('myapp1.urls')),
    path('', include('myapp1.urls')),
    path('myapp2/',include('myapp2.urls')),
]

这些是 MyApp1 的以下路径 (urls.py):

from django.urls import path
from . import views
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('about/', views.about, name='about'),
    path('contact/', views.contact, name='contact'),
]

这些是 MyApp2 的以下路径 (urls.py):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.login, name='login'),
    path('index', views.home, name='home'),
    path('dashboard_output', views.dashboard_output, name='dashboard_output'),
    path('login', views.login, name='login'),
]

在浏览器上,如果我输入 http://127.0.0.1:8000/http://127.0.0.1:8000/myapp1 我会看到 MyApp1。

在浏览器上,如果我输入 http://127.0.0.1:8000/myapp2,我会看到 MyApp2(登录页面)。

到目前为止一切顺利,但如果我输入http://127.0.0.1:8000/myapp2/index,系统会将我定向到 myapp1 的视图而不是 myapp2 的视图。我究竟做错了什么?有什么想法吗?

【问题讨论】:

  • 这些网址不应该发生这种情况。当您转到 myapp2/index 时,您究竟会得到哪个视图?
  • 当我转到 myapp2/index url 时,我正在调用呈现 MyApp2 应用程序的 index.html 页面的主视图。
  • 是的,但你说你有别的东西。究竟是什么?
  • 我得到的是 MyApp1 而不是 MyApp2 的主页。 MyApp1 和 MyApp2 是完全不同的应用程序。
  • 我希望你能具体一点。我知道它们是单独的应用程序。但是你是说当你去“/myapp2/index”时,不是得到myapp2.views.home的结果,而是得到myapp1.views.home的结果?

标签: python django django-urls


【解决方案1】:

我终于找到了导致问题的原因。它与模板有关。看看这个: https://www.webforefront.com/django/customizedjangotemplates.html

Django 的工作方式非常重要。如果您有多个应用程序,并且在 settings.py 文件中将 APP_DIRS 设置为 true ('APP_DIRS': True),它会按照 INSTALLED_APPS 中的应用程序顺序检查每个应用程序的所有模板目录。长话短说,因为我在 MyApp1 和 MyApp2 应用程序的模板目录中都有 index.html 文件,所以它用 MyApp1 模板目录的 index.html 文件覆盖了 MyApp2 模板目录的 index.html 文件。

作为一种解决方案,我只是在 MyApp2 应用程序的模板目录下添加了一个名为 myapp2 的子目录,并在渲染时包含了子文件夹名称。

MyProject
   MyApp1
      static
      templates
         index.html
         ... 
      urls.py
      views.py
      ...
   MyApp2
      static
      templates
         myapp2
           index.html
           ...
      urls.py
      views.py
      ...
   MyProject
      settings.py
      urls.py
      ...

正如我所说,我在渲染函数的第二个参数中添加了子目录名称 (myapp2/)。这里是:

...
return render(request, "myapp2/index.html", result)

我也可以在 MyApp1 中的 templates 文件夹中添加一个子目录,但现在不喜欢它,因为它确实有一个很大的应用程序,不想搞砸它。

无论如何,解决方案奏效了!

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2020-02-03
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多