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

时间:2019-09-10 11:20:13

标签: python django-oscar

我正在使用 django-oscar 2.0.1 开发一个电子商务网站。

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

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

我知道不是唯一一个出现此错误(Django Oscar change URL pattern)的人,但是建议的解决方案是该帖子对我不起作用(可能是因为django-oscar版本目前为1.6.5) ?)。

因此,这是我基于django-oscar documentation执行的步骤:

  • 我用django-oscar和所有依赖项在python venv中创建了一个新项目。
  • 我分叉了目录应用程序
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
  • 我试图将目录基础URL从/ catalogue更改为/ cata:

分叉目录

    # 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'

项目网址

    #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 ? ###
    ]

当我运行服务器时我收到此错误

  

提高NoReverseMatch(“%s不是注册的名称空间”%键)   django.urls.exceptions.NoReverseMatch:“客户”不是注册的名称空间

您对我错过的内容有任何想法吗?

解决方案:

我创建了一个名为“ 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

我修改了项目网址:

项目网址

    #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 个答案:

答案 0 :(得分:1)

这里有几件事:

  1. 您已经定义了<ChartView stock={true} originWhitelist={[""]} style={customStyle} config={chartConfig} javaScriptEnabled={true} domStorageEnabled={true} /> 类,但是您没有在任何地方加载它。您需要将此应用添加到MyShop中。

    请注意,在这种情况下,将INSTALLED_APPS放在目录应用程序中可能没有任何意义-该商店应用程序适用于您的整个项目,而不仅仅是目录。

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

    MyShop

    path('', include(apps.get_app_config('name_of_your_app').urls[0])), 中设置name = 'name_of_your_app'的位置。