use*_*939 4 python django django-urls django-views
我想在 url 中的单个视图中支持上述视图...在我的搜索中,我遇到了这篇文章,该文章不再受支持,并且我找到的所有教程都已过时,其中演示了如何完成任务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"
Run Code Online (Sandbox Code Playgroud)
products/urls.py 包含 ProductListView 和 ProductDetailView 视图的路径。ProductListView 似乎是正确的。ProductDetailView 不正确!我收到以下警告:
警告: ?: (2_0.W001) 您的 URL 模式 '^products/(?P\d+)/$' [name='details'] 的路由包含 '(?P<',以 '^' 开头,或以“$”结尾。这可能是迁移到 django.urls.path() 时的疏忽。
ecommerce.py/urls.py 是我包含产品和详细信息网址的地方
电子商务/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')
]
Run Code Online (Sandbox Code Playgroud)
您收到该警告是因为 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')
]
Run Code Online (Sandbox Code Playgroud)
或者如果您想使用正则表达式来匹配您的网址,则:
# products/urls.py
from django.urls import path, re_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')
]
Run Code Online (Sandbox Code Playgroud)
原因是因为你ProductDetailView继承自DetailViewDjango。该视图已经实现了一些混合来从键获取对象,pk而不是id这就是为什么当您更改为使用它时<int:pk>它会起作用。
你可以看一下源代码,看看Django是如何实现查询对象的。(密切关注SingleObjectMixinmixin 和 property pk_url_kwarg = 'pk'。
我还建议您更改视图pk_url_kwarg中的值ProductDetailView,并记住将pkurlpattern 更改为与pk_url_kwarg值匹配的新值。
| 归档时间: |
|
| 查看次数: |
9388 次 |
| 最近记录: |