【问题标题】:Django Oscar change URL patternDjango Oscar 更改 URL 模式
【发布时间】:2019-07-02 12:55:23
【问题描述】:

我已经设置了一个 django-oscar 项目,我正在尝试配置 U​​RL。我的目标是将/catalogue 更改为/catalog

根据我在myproject/app.py 中添加的app.py 的文档

myproject/app.py

from django.conf.urls import url, include
from oscar import app


class MyShop(app.Shop):
    # Override get_urls method
    def get_urls(self):
        urlpatterns = [
            url(r'^catalog/', include(self.catalogue_app.urls)),
            # all the remaining URLs, removed for simplicity
            # ...
        ]
        return urlpatterns


application = MyShop()

myproject/urls.py

from django.conf.urls import url, include
from django.contrib import admin
from . import views
from .app import application

urlpatterns = [
    url(r'^i18n/', include('django.conf.urls.i18n')),

    url(r'^admin/', admin.site.urls),

    url(r'', application.urls),

    url(r'^index/$',views.index, name = 'index'),
]

项目服务器运行没有任何错误,但是当我尝试localhost:8000/catalog时,我得到了

/catalog/ 'customer' 处的 NoReverseMatch 不是已注册的命名空间。

预期的输出是localhost:8000/catalog 应该返回目录页面。

【问题讨论】:

  • 您是否也覆盖了模板和设置? oscar 默认模板将引用您的自定义 url_patterns 中可能缺少的许多视图。参见例如github.com/django-oscar/django-oscar/blob/master/src/oscar/… 如果您不自定义基本模板、仪表板导航、主页、登录 URL 等,则必须提供许多视图名称...
  • 我没有覆盖任何模板,也没有派生任何应用程序。它只是一个默认的奥斯卡安装。在我配置目录 URL 时是否需要分叉目录应用程序?

标签: django django-oscar


【解决方案1】:

您需要包含 URL,而不是直接引用它们。

url(r'', include('application.urls')),

【讨论】:

  • 我已添加 url(r'', include(application.urls)),但问题仍然存在。这是来自服务器日志的错误“django.urls.exceptions.NoReverseMatch: 'customer' is not a registered namespace”
【解决方案2】:

你可以试试这个

在 app.py 中

from django.conf.urls import url, include
from oscar import app

class MyShop(app.Shop):
    # Override get_urls method
    def get_urls(self):
        urls = [
            url(r'^catalog/', include(self.catalogue_app.urls)),
            # all the remaining URLs, removed for simplicity
            # ...
        ]
        urls = urls + super(MyShop,self).get_urls()
        return urls


application = MyShop()

在你的 urls.py 你可以简单地添加这个

from myproject.app import application as shop

 url(r'', shop.urls),

希望对你有帮助

【讨论】:

  • 我收到此错误“UnboundLocalError: local variable 'urls' referenced before assignment”你的意思是 urls = url + super(MyShop,self).get_urls()?
  • 有效!!!所以基本上我错过了 app.py 中的其余网址。对吗?
  • 希望对你有帮助,
  • 我将您的答案标记为接受,但出现了这个问题-“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。”跨度>
  • 所以当我将 /catalogue 更改为 /catalog 时,/catalogue url 仍然有效。我如何禁用它?
【解决方案3】:

扩展 c.grey's answer 以指定如何替换而不是添加网址 -

from django.conf.urls import url, include
from oscar import app


class MyShop(app.Shop):
    def get_urls(self):
        urls = super(MyShop, self).get_urls()
        for index, u in enumerate(urls):
            if u.regex.pattern == r'^catalogue/':
                urls[index] = url(r'^catalog/', include(self.catalogue_app.urls))
                break
        return urls


application = MyShop()

【讨论】:

  • 如果我必须将复杂的 Url 模式(如 checkout/shipping-address/ 更改为 checkout/billing-address/ 之类的内容)怎么办?
  • @abicrazieeee 那么为什么不分叉checkout 应用程序并在urls.py 中进行更改?不建议对单个 URL 这样做(如我的回答)。
  • 所以我需要分叉结帐应用程序,然后创建 urls.py 文件并重写结帐/帐单地址/的 url 模式。那么我应该(包括)在根 urls.py 中检出 url 吗?您能否告诉我有关如何实现这一点的确切代码,因为我在 GitHub 上找不到默认 Oscar 项目的 urls.py。
  • @abicrazieeee 基本上,在分叉结帐应用程序后,您需要在checkout/app.pyCheckoutApplication 类中执行相同的操作(如答案所示)。修改get_urls,但带有条件u.regex.pattern == r'shipping-address/$' & 修改urls[index] = url(r'billing-address/$', self.shipping_address_view.as_view(), name='shipping-address')。你不需要做任何其他事情(不要在任何地方修改urls.py)。
  • 显示 AppRegistryNotReady("应用尚未加载。")
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2019-12-07
  • 2015-05-19
  • 1970-01-01
  • 2016-08-16
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多