django 2.2.5网址路径中的网址正则表达式

时间:2019-09-17 20:30:14

标签: python django django-views django-urls

我想在url的单个视图中支持以上视图...在搜索中,我遇到了this post不再受支持,并且我发现的所有教程都已经过时了,这表明了如何在Django 1.8.3中完成任务。

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

products / 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)您的网址格式'^ products /(?P \ d +)/ $'   [name ='details']的路由包含'(?P <',以'^'开头,   或以“ $”结尾。迁移到   django.urls.path()。

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

ecommerce / 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')
    ]

1 个答案:

答案 0 :(得分:0)

您已收到该警告,因为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。该View已经实现了一些混合操作,以便从pk键而不是id获取对象,这就是为什么当您更改为使用<int:pk>时它将起作用的原因。

您可以看一下the source code,以了解Django如何实现查询对象。 (请注意SingleObjectMixin混合和属性pk_url_kwarg = 'pk'

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