url 路径中的 django 2.2.5 URL 正则表达式
django 2.2.5 URL regex in url path
我想在 url 的单个视图中支持上述视图 ...在我的搜索中,我遇到了不再受支持的 以及我找到的所有教程已经过时,它演示了如何在 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 不正确!我收到以下警告:
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 是我包含产品和详细信息的地方 urls
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')
]
您收到该警告是因为 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')
]
或者如果您想使用正则表达式来匹配您的 url 那么:
# 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
获取对象,这就是为什么当您更改为使用 <int:pk>
时它会起作用。
您可以查看 the source code 以了解 Django 如何实现查询对象。 (请关注 SingleObjectMixin
mixin 和 属性 pk_url_kwarg = 'pk'
。
我还建议您在 ProductDetailView
视图中更改 pk_url_kwarg
的值,同时记得将 url 模式中的 pk
更改为匹配的新值具有 pk_url_kwarg
值。
我想在 url 的单个视图中支持上述视图 ...在我的搜索中,我遇到了不再受支持的
在 '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 不正确!我收到以下警告:
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 是我包含产品和详细信息的地方 urls
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')
]
您收到该警告是因为 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')
]
或者如果您想使用正则表达式来匹配您的 url 那么:
# 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
获取对象,这就是为什么当您更改为使用 <int:pk>
时它会起作用。
您可以查看 the source code 以了解 Django 如何实现查询对象。 (请关注 SingleObjectMixin
mixin 和 属性 pk_url_kwarg = 'pk'
。
我还建议您在 ProductDetailView
视图中更改 pk_url_kwarg
的值,同时记得将 url 模式中的 pk
更改为匹配的新值具有 pk_url_kwarg
值。