Django-oscar:如何从 root APP 更改 URL?

Django-oscar : how to change the URL from root APP?

我正在使用 django-oscar 2.0.1.

开发电子商务网站

我想更改 url 以访问目录(如文档中 here 所述),但我总是收到此错误:

**NoReverseMatch at / 'customer' is not a registered namespace.**.

我知道我不是唯一遇到此错误的人 (),但建议的解决方案 post 对我不起作用(可能是因为 django-oscar 版本是此时1.6.5?)。

所以,这是我基于 django-oscar documentation 遵循的步骤:

python manage.py oscar_fork_app catalogue forkedApps
    #'oscar.apps.catalogue',
    'forkedApps.catalogue.apps.CatalogueConfig',
    'oscar.apps.catalogue.reviews',

这是项目的结构:

project
    > forkedApps
        > catalogue
            . __init__.py
            . admin.py
            . apps.py
            . models.py
    > project
        . __init__.py
        . settings.py
        . urls.py
        . wsgi.py

分支目录

    # forkedApps/catalogue/apps.py

    import oscar.apps.catalogue.apps as apps
    from oscar import config
    from django.conf.urls import url

    from django.views.generic.base import RedirectView
    from django.urls import reverse_lazy

    class CatalogueConfig(apps.CatalogueConfig):
        name = 'forkedApps.catalogue'

    class MyShop(config.Shop):

        # Override get_urls method
        def get_urls(self):
            from django.contrib.auth import views as auth_views

            from oscar.views.decorators import login_forbidden
            urlpatterns = [
                url(r'^cata/', self.catalogue_app.urls),
                url(r'^$', RedirectView.as_view(url=reverse_lazy('catalogue:index')), name='home'),
                url(r'^basket/', self.basket_app.urls),
                #...all other urls
            ]
            return urlpatterns

项目初始化

    #project/project/__init__.py

    default_app_config = 'forkedApps.catalogue.apps.MyShop'

项目url

    #project/project/urls.py

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

    urlpatterns = [
        path('i18n/', include('django.conf.urls.i18n')),

        path('admin/', admin.site.urls),
        #path('', include(apps.get_app_config('oscar').urls[0])),
        path('', include(apps.get_app_config('catalogue').urls[0])),
        ### Does catalogue refers to my forked catalogue ? ###
    ]

当我 运行 服务器 我得到这个错误 :

raise NoReverseMatch("%s is not a registered namespace" % key) django.urls.exceptions.NoReverseMatch: 'customer' is not a registered namespace

你知道我错过了什么吗?

解决方案:

我创建了一个名为'oscar_url'(任意名称)的APP,并将其添加到INSTALLED_APPS

oscar_url 初始化

    #project/oscar_url/__init__.py

    default_app_config = 'oscar_url.apps.MyShop'

oscar_url 应用程序

    #project/oscar_url/apps.py
    import oscar.config as apps
    from django.views.generic.base import RedirectView
    from django.urls import reverse_lazy
    from django.conf.urls import url

    class MyShop(apps.Shop):
        name = 'oscar_url'

        def get_urls(self):
            from django.contrib.auth import views as auth_views

            from oscar.views.decorators import login_forbidden
            urlpatterns = [
                url(r'^cata/', self.catalogue_app.urls),
                url(r'^$', RedirectView.as_view(url=reverse_lazy('catalogue:index')), name='home'),
                url(r'^basket/', self.basket_app.urls),
                url(r'^checkout/', self.checkout_app.urls),
                #all others urls...
            ]
            return urlpatterns

并且我修改了项目 urls :

项目url

    #project/project/urls.py

    urlpatterns = [
        path('i18n/', include('django.conf.urls.i18n')),

        path('admin/', admin.site.urls),

        #path('', include(apps.get_app_config('oscar').urls[0])),
        path('', include(apps.get_app_config('oscar_url').urls[0])),
    ]

这里有几件事:

  1. 您已经定义了一个 MyShop class,但是您没有在任何地方加载它。您需要将此应用添加到您的 INSTALLED_APPS 中。

    请注意,在这种情况下,让 MyShop 存在于您的目录应用程序中可能没有意义 - 此商店应用程序适用于您的整个项目,而不仅仅是目录。

  2. 在您的项目 URL 中,您需要加载此新应用的配置而不是 Oscar 的配置:

    path('', include(apps.get_app_config('name_of_your_app').urls[0])),
    

    MyShop 中设置 name = 'name_of_your_app' 的位置。