wagtail / wagtail-generic-chooser

A toolkit for custom chooser popups in Wagtail
BSD 3-Clause "New" or "Revised" License
116 stars 25 forks source link

Chosen url only accepts integers as id #72

Open jaap3 opened 1 year ago

jaap3 commented 1 year ago

Currently the urlpatterns generated by the ChooserViewSet only accept integers (d+) as the id parameter:

https://github.com/wagtail/wagtail-generic-chooser/blob/db66c35cd641cedcb3c4a771b859cfec4623ed00/generic_chooser/views.py#L732-L737

This makes it impossible to create a chooser that has UUIDs as a primary key.

mojeto commented 1 year ago

Minimum code to get around this:

from django.urls import path
from generic_chooser.views import BaseChosenView, DRFChooserViewSet

class UUIDCapableChosenView(BaseChosenView):
    def get(self, request, pk):
        # needed to prevent TypeError: expected string or bytes-like object, got 'UUID'
        return super().get(request, str(pk))

class ChooserViewSet(DRFChooserViewSet):
    base_chosen_view_class = UUIDCapableChosenView

    def get_urlpatterns(self):
        urls = super().get_urlpatterns()
        urls[1] = path("<uuid:pk>/", self.chosen_view, name="chosen")
        return urls