Как правильно использовать идентификатор UUID в качестве параметра URL в Django? - PullRequest
0 голосов
/ 01 октября 2019

Я пытался передать идентификатор UUID4 в URL для конкретной страницы сведений.

После просмотра Stackoverflow и других сайтов вот что я попробовал:

  1. Передача пути URL как path('car/<uuid:id>/', views.CarDetailView.as_view(), name='car-detail'),

Но этовыдает ошибку: Общий подробный вид CarDetailView должен вызываться с объектом pk или слагом в URLconf. .

Поскольку поле uuid состоит из букв и цифр, я могуне использовать int.

Итак, я использовал это:

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

, который возвращает грязный и неработающий URL: showroom /% 5E (% 3FP09c32f72-5863-49fa-a42a-1d0fed274c4e%5Cw +) / $

Затем я попытался вернуться к оригиналу, но с помощью метода def_object в классе View.
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'"

models.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 / , в котором отображается подробный вид для конкретного объекта.

Есть идеи?

Обновление

Согласно ответу ниже, я изменил переопределение get_object на

    slug_field = 'title'
    slug_url_kwarg = 'car_detail'

Но я все еще получаю тот же urlconf, который должен быть вызван с ошибкой slug или int. Должен ли я определить слаг в моделях?

Обновление 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

1 Ответ

3 голосов
/ 01 октября 2019

Вам не нужно переопределять метод get_object(). Вы можете просто использовать slug_url_kwarg и slug_field. Например:

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

Более подробную информацию можно найти в get_object() документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...