gpt4 book ai didi

python - 如何在 Django 中正确使用 UUID id 作为 url 参数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:11:09 25 4
gpt4 key购买 nike

我一直在尝试将 UUID4 id 传递到特定详细信息页面的 url 中。

在浏览了 Stackoverflow 和其他网站之后,这是我目前尝试过的:

  1. 将 url 路径作为 path('car/<uuid:id>/', views.CarDetailView.as_view(), name='car-detail'), 传递

但这会引发错误:必须使用对象 pk 或 URLconf 中的 slug 调用通用详细信息 View CarDetailView。

由于uuid字段由字母和数字组成,我不能使用int。

  1. 所以我用了这个:

path(r"^(?P<car_model>\w+)/$", views.CarDetailView.as_view(), name='car-detail'),

返回凌乱和损坏的 url:showroom/%5E(%3FP09c32f72-5863-49fa-a42a-1d0fed274c4e%5Cw+)/$

  1. 然后我尝试恢复到原来的状态,但在 View 类中使用了 def_object 方法。
def get_object(self):
object = get_object_or_404(CarInstance,title=self.kwargs['car_model'])
return object

但这会返回错误:"KeyError at/showroom/car/09c32f72-5863-49fa-a42a-1d0fed274c4e/'car_model'”

模型.py

class CarInstance(models.Model):
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.SET_NULL, null=True)
car_model = models.CharField('Model', max_length=50, null=True)

views.py

class CarDetailView(generic.DetailView):
model = CarInstance
template_name = 'car_detail'

def get_queryset(self):
return CarInstance.objects.all()

def get_object(self):
object = get_object_or_404(CarInstance,title=self.kwargs['car_model'])
return object

def get_absolute_url(self):
return reverse('showroom:car-detail', args=[str(self.pk)])

URL 的格式应为 showroom/car/09c32f72-5863-49fa-a42a-1d0fed274c4e/,这会显示特定对象的详细 View 。

有什么想法吗?

更新

根据下面的答案,我将 get_object 覆盖更改为

    slug_field = 'title'
slug_url_kwarg = 'car_detail'

但我仍然收到相同的 urlconf must be called with slug or int 错误。我应该在模型中定义 slug 吗?

更新 2

我已经更改了 urlconf,但它引发了同样的错误。这是完整的回溯

Environment:


Request Method: GET
Request URL: http://localhost:8000/showroom/car/09c32f72-5863-49fa-a42a-1d0fed274c4e/

Django Version: 2.2.5
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'showroom']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\USER\Envs\torque\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)

File "C:\Users\USER\Envs\torque\lib\site-packages\django\core\handlers\base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)

File "C:\Users\USER\Envs\torque\lib\site-packages\django\core\handlers\base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\USER\Envs\torque\lib\site-packages\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)

File "C:\Users\USER\Envs\torque\lib\site-packages\django\views\generic\base.py" in dispatch
97. return handler(request, *args, **kwargs)

File "C:\Users\USER\Envs\torque\lib\site-packages\django\views\generic\detail.py" in get
106. self.object = self.get_object()

File "C:\Users\USER\Envs\torque\lib\site-packages\django\views\generic\detail.py" in get_object
47. "pk or a slug in the URLconf." % self.__class__.__name__

Exception Type: AttributeError at /showroom/car/09c32f72-5863-49fa-a42a-1d0fed274c4e/
Exception Value: Generic detail view CarDetailView must be called with either an object pk or a slug in the URLconf.

** 另一个更新 **

感谢@ruddra 的帮助,我更改了路径以匹配 slug_url_kwarg = 'car_detail' 现在看起来像这样:

path('car/<slug:car_detail>/', views.CarDetailView.as_view(), name='car-detail')

但是,现在该页面引发了 404 错误。

Page not found (404)
Request Method: GET
Request URL: http://localhost:8000/showroom/car/09c32f72-5863-49fa-a42a-1d0fed274c4e/
Raised by: showroom.views.CarDetailView
No car instance found matching the query

最佳答案

您不需要覆盖 get_object() 方法。您可以简单地使用 slug_url_kwargslug_field .像这样:

class CarDetailView(generic.DetailView):
model = CarInstance
template_name = 'car_detail'
slug_field = 'title'
slug_url_kwarg = 'car_model'

更多信息可以在 get_object() 中找到文档。

关于python - 如何在 Django 中正确使用 UUID id 作为 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58180922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com