django 2.2.5 URL 路径中的 URL 正则表达式

Posted

技术标签:

【中文标题】django 2.2.5 URL 路径中的 URL 正则表达式【英文标题】:django 2.2.5 URL regex in url path 【发布时间】:2020-01-18 18:07:49 【问题描述】:

我想在 url 的单个视图中支持上述视图 ...在我的搜索中,我遇到了不再支持的 this post,并且我发现的所有教程都已过时,它演示了如何在 django 1.8.3 中完成任务。

在“products/views.py”中,我为产品和详细信息创建了一个视图。 ProductListView 将显示所有产品,而 ProductDetailView 将显示单个产品详细信息(标题、描述、价格等)。

产品/views.py

class ProductListView(ListView):
    queryset = Product.objects.all()
    template_name = "products/list.html"


class ProductDetailView(DetailView):
    queryset = Product.objects.all()
    template_name = "products/detail.html"

products/urls.py 包含 ProductListView 和 ProductDetailView 视图的路径。 ProductListView 似乎是正确的。 ProductDetailView 不正确!我收到以下警告:

警告:?: (2_0.W001) 您的 URL 模式 '^products/(?P\d+)/$' [name='details'] 有一个包含 '(?P

ecommerce.py/urls.py 是我包含产品和详细信息 url 的地方

电子商务/urls.py:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

from .views import home, about, contact

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
    path('about/', about, name='about'),
    path('products/', include('products.urls'), name='products'),
    path('products/', include('products.urls'), name='details'),
    path('contact/', contact, name='contact'),
    path('account/', include('allauth.urls'), name='login'),
    path('register/', include('allauth.urls'), name='register'),

              ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)



products/urls.py

    from django.urls import path
    from .import views

    urlpatterns = [
        path('', views.ProductListView.as_view(), name='products'),
        path(r'^products/(?P<id>\d+)/$', views.ProductDetailView.as_view(), name='details')
    ]

【问题讨论】:

如果您想使用正则表达式来匹配您的网址,请尝试改用re_path。或者使用路径,您应该更改为path('product/&lt;int:id&gt;/', ...) re_path(r'^products/(?P\d+)/$', ProductDetailView.as_view()) 正在工作,但是有没有更清洁更有效的方法呢? path('products/', ProductDetailView.as_view()) 不起作用。 我相信这个path('products/&lt;int:pk&gt;/', ProductDetailView.as_view()) 应该和re_path(r'^products/(?P&lt;pk&gt;\d+)/$', ProductDetailView.as_view()) 一样工作。将 id 更改为 pk 可能会起作用。 谢谢。 path('products//', ProductDetailView.as_view()) 有效。为什么 path('products//', ProductDetailView.as_view()) 不起作用?不是 pk == id 吗? 让我给你一个详细的答案,让你明白为什么会这样。 【参考方案1】:

您收到该警告是因为 Django 无法将 url 与您的任何 urlpattern 匹配。很快你就可以用它来解决你的问题了:

# products/urls.py

from django.urls import path
from .import views

urlpatterns = [
    path('', views.ProductListView.as_view(), name='products'),
    path('products/<int:pk>/$', views.ProductDetailView.as_view(), name='details')
]

或者如果您想使用正则表达式来匹配您的网址,那么:

# products/urls.py

from django.urls import path
from .import views

urlpatterns = [
    path('', views.ProductListView.as_view(), name='products'),
    re_path(r'^products/(?P<pk>\d+)/$', views.ProductDetailView.as_view(), name='details')
]

原因是你的ProductDetailView 继承自 Django 的DetailView。该视图已经实现了一些混合来从 pk 键而不是 id 获取对象,这就是为什么当您更改为使用 &lt;int:pk&gt; 时它会起作用。

您可以查看the source code 以了解 Django 如何实现查询对象。 (请留意SingleObjectMixin mixin 和属性pk_url_kwarg = 'pk'

我还建议您更改ProductDetailView视图中pk_url_kwarg的值,并记住将urlpattern中的pk更改为与pk_url_kwarg值匹配的新值。

【讨论】:

以上是关于django 2.2.5 URL 路径中的 URL 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

单击 django 中的 href 链接时出现意外/不需要的 url 路径

与 Django 通用视图中的 pk 不同的 url 路径

Django 页面无法呈现 - views.py url 路径中的错误

如何修复Django添加URL路径中的错误,找不到未链接到新代码

在 Django 中将文件路径作为 URL 参数传递

Django FileField 保存 url 而不是数据库中的路径