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

标签 python django django-views django-urls

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

在“products/views.py”中,我为产品和详细信息创建了一个 View 。 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 的 View 路径。 ProductListView 似乎是正确的。 ProductDetailView 不正确!我收到以下警告:

WARNINGS: ?: (2_0.W001) Your URL pattern '^products/(?P\d+)/$' [name='details'] has a route that contains '(?P<', begins with a '^', or ends with a '$'. This was likely an oversight when migrating to django.urls.path().

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

最佳答案

你收到那个警告是因为 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继承自 DetailView Django 。该 View 已经实现了一些 mixin 以从 pk 获取对象键而不是 id这就是为什么当您更改为使用 <int:pk> 时它会起作用。

可以看看the source code看看 Django 如何实现查询对象。 (请关注 SingleObjectMixin mixin 和属性 pk_url_kwarg = 'pk'

我还建议您更改 pk_url_kwarg 的值在 ProductDetailView查看并记得更改pk在 urlpattern 中输入与 pk_url_kwarg 匹配的新值值(value)。

关于python - url路径中的django 2.2.5 URL正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57981659/

相关文章:

python - pandas 日期字段的 cut/qcut 等价于什么?

python - Scipy Weibull 参数置信区间

javascript - 带有 {% for %} 和 {% if %} 的 Django 模板?

django-models - Feincms 混合内容类型

python - 具有 ImageField 属性的 Django UpdateView

Android Python 获取gps状态

python - 这个错误TypeError : 'Button' object is not callable mean?是什么意思

python - Django 按月注释分组

Django 没有连接到 Elastic beanstalk 上的 PostGres

DJANGO:TemplateDoesNotExist:auth/user_confirm_delete.html