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 遵循的步骤:
- 我使用 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'
项目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])),
]
这里有几件事:
您已经定义了一个 MyShop
class,但是您没有在任何地方加载它。您需要将此应用添加到您的 INSTALLED_APPS
中。
请注意,在这种情况下,让 MyShop
存在于您的目录应用程序中可能没有意义 - 此商店应用程序适用于您的整个项目,而不仅仅是目录。
在您的项目 URL 中,您需要加载此新应用的配置而不是 Oscar 的配置:
path('', include(apps.get_app_config('name_of_your_app').urls[0])),
在 MyShop
中设置 name = 'name_of_your_app'
的位置。
我正在使用 django-oscar 2.0.1.
开发电子商务网站我想更改 url 以访问目录(如文档中 here 所述),但我总是收到此错误:
**NoReverseMatch at / 'customer' is not a registered namespace.**.
我知道我不是唯一遇到此错误的人 (
所以,这是我基于 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'
项目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])),
]
这里有几件事:
您已经定义了一个
MyShop
class,但是您没有在任何地方加载它。您需要将此应用添加到您的INSTALLED_APPS
中。请注意,在这种情况下,让
MyShop
存在于您的目录应用程序中可能没有意义 - 此商店应用程序适用于您的整个项目,而不仅仅是目录。在您的项目 URL 中,您需要加载此新应用的配置而不是 Oscar 的配置:
path('', include(apps.get_app_config('name_of_your_app').urls[0])),
在
MyShop
中设置name = 'name_of_your_app'
的位置。