Вызовите имя URL из другого приложения в Django, используя Pattern Name + RedirectVew - PullRequest
0 голосов
/ 11 мая 2018

Я работаю над некоторыми перенаправлениями для нескольких URL-путей.

Мне пришлось переместить несколько моих путей в другое приложение.

У меня возникла проблема, вызывающаяимя шаблона для ссылки на другой URL в моем RedirectView.Вот URL, который я пытаюсь перенаправить, который находится в приложении «сделки»:

 path('<slug:slug>/', RedirectView.as_view(pattern_name='deal_detail', permanent=False))

Обратите внимание, что я также импортирую представления из ссылочного приложения, например, так:

from dealmazing.views import *

Новый URL-адрес, на который я хочу перенаправить его, находится в моей основной директории приложения и выглядит следующим образом:

path('<slug:slug>/', deal_by_detail, name='deal_detail'),

Проблема в том, что я получаю эту ошибку:

Reverse for 'deal_detail' not found. 'deal_detail' is not a valid view function or pattern name.

Разве нельзя ссылаться на внешнее имя шаблона?

ОБНОВЛЕНИЕ

Мои новые URL-адреса работают правильно после добавления «разборки» в мое имя шаблона имя-шаблона- но одна проблема.

вот код в моем приложении «сделки»

path('<slug:slug>/', RedirectView.as_view(pattern_name='dealmazing:deal_detail', permanent=False)),

и путь URL в моем приложении «сделки»

path('<slug:slug>/', deal_by_detail, name='deal_detail'),

Если перейти по старой ссылке, я получаю ошибку 'dealmazing' is not a registered namespace.Обратите внимание, что у меня не было app_name или пространства имен, заданных в моем файле с URL.Я пытался это и до сих пор не работает.Это ошибка, которую я получаю:

Traceback:

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\urls\base.py" in reverse
  74.                 extra, resolver = resolver.namespace_dict[ns]

During handling of the above exception ('dealmazing'), another exception occurred:

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in get
  180.         url = self.get_redirect_url(*args, **kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in get_redirect_url
  170.             url = reverse(self.pattern_name, args=args, kwargs=kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\urls\base.py" in reverse
  84.                     raise NoReverseMatch("%s is not a registered namespace" % key)

Exception Type: NoReverseMatch at /deals/steak-fries-beer-only-999-walkabout-wednesday/
Exception Value: 'dealmazing' is not a registered namespace

вот файл URL моей сделки:

from django.urls import include, path
from django.contrib import admin
from django.views.generic.base import RedirectView
from .views import *
from dealmazing.urls import *
from dealmazing.views import *
from deals.views import DealListView
from django.conf import settings

app_name = "deals"

urlpatterns = [
    path('', Home.as_view(), name="deals"),
    path('latest-deals', DealListView.as_view(), name="latest-deals"),
    path('hot-deals', DealHotView.as_view(), name="hot-deals"),
    path('results/', search, name='deal-search'),
    path('category/<str:category>', RedirectView.as_view(pattern_name='dealmazing:category', permanent=False)),
    path('<slug:slug>/', RedirectView.as_view(pattern_name='dealmazing:deal_detail', permanent=False)),
    path('<int:pk>/like', like, name='like'),
    path('<int:pk>/favorite', favorite, name='favorite'),
    path('<int:pk>/remove_favorite', remove_favorite, name='remove_favorite'),
]

и файл моих основных (неутешительных) URL:

from django.conf.urls import url, include
from django.contrib.sitemaps.views import sitemap
from django.views.generic import TemplateView
from .sitemaps import *
from django.urls import path
from django.contrib import admin
from .views import *
from django.conf import settings
from deals.models import Deal
from deals.views import *

from django.conf.urls.static import static

sitemaps = {
    'static': StaticViewSitemap,
    'blog': BlogSitemap,
    'blog-category': BlogCategorySitemap,
    'deals': DealSitemap,
    'deals-category': DealCategorySitemap,
    'retailers': RetailerSitemap
}

urlpatterns = [
    url(r'^$', Home.as_view(), name="home"),
    url(r'^oauth/', include('social_django.urls', namespace='social')),
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include("blog.urls", namespace="blog")),
    url(r'^accounts/', include("accounts.urls", namespace="accounts")),
    url(r'^about/', about, name="about"),
    url(r'^contact/', contact, name="contact"),
    url(r'^disclosure/', disclosure, name="disclosure"),
    url(r'^terms/', terms, name="terms"),
    url(r'^privacy/', privacy, name="privacy"),
    url(r'^submit_deal/', submit_deal, name="submit_deal"),
    url(r'^thanks/', thanks, name="thanks"),
    url(r"^deals/", include("deals.urls", namespace="deals")),
    path('<slug:slug>/', deal_by_detail, name='deal_detail'),
    path('deals/<slug:slug>', deals_by_retailer, name='retailer'),
    path('category/<str:category>', deals_by_category, name='category'),
    url(r"^newsletter/", include("newsletters.urls", namespace="newsletter")),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^robots.txt$', TemplateView.as_view(template_name="robots.txt", content_type="text/plain"), name="robots_file"),
    path('sitemap.xml', sitemap,
         {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
    path('', include('django.contrib.auth.urls')),
] 

if settings.DEBUG:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

1 Ответ

0 голосов
/ 11 мая 2018

Если вы установили app_name в своем core/urls.py или задали пространство имен при включении URL-адресов, то вам нужно будет включить это.Например:

path('<slug:slug>/', RedirectView.as_view(pattern_name='core:deal_detail', permanent=False))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...