django_hosts — NoReverseMatch: обратный для ‘home’ не найден. ‘home’ не является допустимым именем функции просмотра или шаблона

#django #django-hosts

#django #django-hosts

Вопрос:

Версии:

 Django                   2.2.10
django-hosts             4.0
  

Я успешно установил django_hosts в соответствии с этой документацией .

Теперь я могу успешно получить доступ к таким страницам, как https://blog.mysite.com

Однако URL-адреса на странице разрешены неправильно. Я последовал примеру, приведенному в официальной документации django_hosts.

Вот как выглядит моя настройка:

mysite/urls.py

 # imports etc. truncated for brevity 
# ...

urlpatterns = [
    path('', include(('home.urls', 'home'), namespace='home')),   
    path('blog/', include('blog.urls', namespace="blog")),
    # ...
]
  

home/urls.py

 from django.urls import path
from django.conf.urls import include, url 

from .views import HomePageView, AboutView, TermsView, PrivacyView, 
                    sample, register, signin

app_name = 'home'

urlpatterns = [
    path('', HomePageView.as_view(), name='index'),
    path('about', AboutView.as_view(), name='about'),
    path('terms', TermsView.as_view(), name='terms'),
    path('privacy', PrivacyView.as_view(), name='privacy'),

    path('sample', sample),    
    path('register', register, name='register'),
    path('signin', signin, name='signin'),
]
  

blog/templates/index.html

                     <div class="container">
116                     <!-- Logo -->
117                     <a class="logo" href="{% host_url 'home' host 'www' %}" style="text-decoration: none; font-size: 250%;">
118                         <img src="/static/assets/img/logo.png">
119                         My Site
120                     </a>                    
121                     <!-- End Logo -->
  

[[ Править ]]

Фактическая демонстрация загружена на github

Комментарии:

1. home — это имя, а не URL-адрес. куда должна идти ссылка href ?

2. Я не понимаю, как вы следовали связанной документации. Практически нет ничего похожего.

3. @Melvyn первая ссылка показывает, как установить и настроить django_hosts приложение. Официальная ссылка на документацию показывает, как использовать host_url тег шаблона.

4. @EricMartin Я не понимаю вашего комментария. Пожалуйста, уточните

5. В этой документации показано использование host вместо path для urlpatterns и другой структуры приложения. Что @EricMartin означает, что ваша подпись вызова для include неверна. Ваш первый член кортежа должен быть итерацией шаблонов, а не ссылкой на модуль.

Ответ №1:

ниже, как мне удалось решить проблему

 . mysite

  .. blog  # Blog app
     .. __init__.py
     .. urls.py

  .. home  # Home app
     .. __init__.py
     .. urls.py


  .. mysite

     .. urls
        .. __init__.py
        .. blog.py
        .. home.py

     .. settings.py

     .. hosts.py

  

в mysite/settings.py

 [..]

ALLOWED_HOSTS = [
              'mysite.com',
         'blog.mysite.com',
]

[..]


MIDDLEWARE = [
    'django_hosts.middleware.HostsRequestMiddleware',  # django hosts

    [..]

    'django_hosts.middleware.HostsResponseMiddleware',  # django hosts
]

ROOT_URLCONF = 'mysite.urls.home'

# django-hosts
# https://django-hosts.readthedocs.io/en/latest/#settings

ROOT_HOSTCONF = 'mysite.hosts'

DEFAULT_HOST = 'www'  # HERE see hosts.py

PARENT_HOST = 'mysite.com'

# HOST_SCHEME = 'http'

# HOST_PORT = 8000

# HOST_SITE_TIMEOUT = 3600

[..]
  

в mysite/hosts.py

 from django.conf import settings

from django_hosts import patterns, host


host_patterns = patterns('',

    # mysite.com
    host(r'^$', 'settings.ROOT_URLCONF', name='www'),  # see 'settings.py'

    # blog.mysite.com
    host(r'blog', 'mysite.urls.blog', name='blog'),
)

  

в mysite/urls/home.py

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


urlpatterns = [
    path('',       include('home.urls', namespace='home')),

    path('admin/', admin.site.urls),  # Admin Area
]

[..]
  

в mysite/urls/blog.py

 from django.urls import path, include


urlpatterns = [
    path('', include('apps.blog.urls', namespace='blog')),

]

[..]
  

в blog/templates/index.html

 <div class="container">
    <!-- Logo -->
    
     <!-- HERE you don't need to specify host 'www' since it defaults to 'www' see settings.py -->
    <a class="logo" href="{% url 'home:index' %}" style="text-decoration: none; font-size: 250%;">
        <img src="/static/assets/img/logo.png">
        My Site
    </a>
    <!-- End Logo -->

  

Комментарии:

1. Спасибо за ваш ответ. Я заметил, что у вас необычная структура каталогов: есть mysite/urls папка. Это намеренно или ошибка? Кроме того, требуется ли эта необычная структура django_hosts для корректной работы точки доступа при маршрутизации URL-адресов?

2. да, это намеренно, а не ошибка, это просто пакет python ( __init__.py ), чтобы сделать приложение модульным, простым в расширении и обслуживании.

3.@HomunculusReticulli вы можете взглянуть на исходный код djangoproject.com github.com/django/djangoproject.com/tree/master/djangoproject и вы поймете эту идею

4. Я загрузил код для демонстрации, который воспроизводит проблему, на github, чтобы вы могли видеть, что я на самом деле делаю. Смотрите здесь: github.com/Pointer2VoidStar/subdomain-demo

5. @HomunculusReticulli теперь проблема должна быть решена (я потратил много времени на свою очень старую машину), и она работает на windows7 win 32, wampserver2.5, python 3.8.7, обратитесь к этому репозиторию: github.com/cizario/subdomain-demo , я знаю, что должен раскошелиться, но …