当我使用我的自定义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']

问题: 为什么PK不匹配正则表达式有什么问题 以下提供了详细信息

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)

template

我试过用

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

另外,

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

其中哈希德_id如下所示

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

他们两个都不管用

推荐答案

您正在编码两次,您不应该使用hashed_id,因为这会再次对其进行哈希处理,但是:

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

路径转换器的 idea 是,它将以透明的方式同时执行encodingdecoding.

您还应该not使用f字符串,因为这将interpolate花括号中的项,因此:

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,)'

因此,这意味着正则表达式不再使用像{9,}这样的量词,而是要求在末尾使用8和逗号.

Django相关问答推荐

自定义公钥打破Django管理内联逻辑

Django:无法分配必须是实例(&Q;X),不想获取对象(&Q;)

Django www.example.com从常量列表中删除值

django优化查询

源自访问外键关系的模型方法 get_absolute_url 的 django 重复 SQL 查询

Django 相当于子查询

Django 模型:如何查找自动生成的字段列表

django REST 框架 - 嵌套 ModelSerializer 的有限查询集?

何时在 django 中使用 pre_save、save、post_save?

try 编辑/创建时,特定模型的 Django 管理员挂起(直到超时错误)

Django 相当于 COUNT 和 GROUP BY

Django:通过manage.py使用服务器和gunicorn等其他服务器之间的区别.哪个更好?

使用 XMLHttpRequest 提示下载文件

jinja2模板引擎中的这个-是做什么的?

如何在 twitter-bootstrap 模式窗口中插入 django 表单?

django 模板 if 或语句

Celery - 在一台服务器上运行不同的工作人员

如何将 django csrf 令牌直接嵌入 HTML?

Django Admin:如何在内联中显示模型上定义的属性?

如何检测 Heroku 的环境?