Как настроить путь (URL) для нескольких приложений Django в одном проекте Django - PullRequest
0 голосов
/ 27 октября 2019

У меня есть один проект 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',
]

Это следующие пути (urls.py) MyProject.

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

Это следующие пути (urls.py) MyApp1:

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

Это следующие пути (urls.py) MyApp2:

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. Что я делаю неправильно? Есть идеи?

1 Ответ

0 голосов
/ 28 октября 2019

Я наконец-то нашел причину проблемы. Это связано с шаблонами. Проверьте это: https://www.webforefront.com/django/customizedjangotemplates.html

Это действительно важно, как работает Django. Если у вас есть несколько приложений и если для APP_DIRS задано значение true («APP_DIRS»: True) в файле settings.py, он проверяет все каталоги шаблонов каждого приложения в порядке приложений в INSTALLED_APPS. Короче говоря, поскольку у меня были файлы index.html в каталогах шаблонов приложений MyApp1 и MyApp2, он заменял файл index.html каталога шаблонов MyApp2 на файл index.html каталога шаблонов MyApp1.

В качестве решения я просто добавил подкаталог 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, но пока не предпочел его, потому что он действительно получил большое приложение и не хотел возитьсяс этим.

В любом случае, решение сработало!

...