Передача параметров 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
и запятую в конце.