Передача параметров url с помощью пользовательского конвертера url в django

Я получаю эту ошибку, когда использую свой собственный конвертер url

Reverse for 'user-update' with keyword arguments '{'pk': 'Rwdr4l3D'}' not found. 1 pattern(s) tried: ['users/(?P<pk>[a-zA-Z0-9](8,))/update/\\Z']

Вопрос: почему пк не соответствует регексу, что не так? подробности приведены ниже

urls.py

from utils.url import HashIdConverter
register_converter(HashIdConverter, "hashid")
app_name = "users"
urlpatterns = [    
    path("<hashid:pk>/update/", views.UserUpdateView.as_view(), name="user-update"),
                  *******

utils/url.py

class HashIdConverter:
    regex = f'[a-zA-Z0-9]{8,}'

    def to_python(self, value):
        return h_decode(value)

    def to_url(self, value):
        return h_encode(value)

шаблон

Я пробовал использовать

<a href="{% url 'users:user-update' pk=user.hashed_id %}"

также,

<a href="{% url 'users:user-update' user.hashed_id %}"

где hashed_id имеет следующий вид

def hashed_id(self):
        return h_encode(self.id)

ни один из них не работает

Вы кодируете дважды, вы не должны использовать hashed_id, так как это приведет к повторному хэшированию, но:

<a href="{% url 'users:user-update' pk=user.id %}">

Идея конвертера путей заключается в том, что он будет выполнять как кодирование, так и декодирование прозрачным образом.

Вы также должны не использовать f строку, так как это будет интерполировать элемент между фигурными скобками, так:

class HashIdConverter:
    regex = '[a-zA-Z0-9]{8,}'  # 🖘 no f-string

    def to_python(self, value):
        return h_decode(value)

    def to_url(self, value):
        return h_encode(value)

Действительно, строка f определит, что вы используете кортеж, и таким образом преобразует это в:

>>> f'[a-zA-Z0-9]{8,}'
'[a-zA-Z0-9](8,)'

Это означает, что regex больше не будет использовать квантификатор типа {9,}, а требует 8 и запятую в конце.

Вернуться на верх