我正在使用 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执行的步骤:
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'
项目网址
#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])),
]
答案 0 :(得分:1)
这里有几件事:
您已经定义了<ChartView
stock={true}
originWhitelist={[""]}
style={customStyle}
config={chartConfig}
javaScriptEnabled={true}
domStorageEnabled={true} />
类,但是您没有在任何地方加载它。您需要将此应用添加到MyShop
中。
请注意,在这种情况下,将INSTALLED_APPS
放在目录应用程序中可能没有任何意义-该商店应用程序适用于您的整个项目,而不仅仅是目录。
在您的项目URL中,您需要加载此新应用的配置,而不是Oscar的配置:
MyShop
在path('', include(apps.get_app_config('name_of_your_app').urls[0])),
中设置name = 'name_of_your_app'
的位置。