gpt4 book ai didi

python - 为什么 django 的 reverse() 不能匹配电子邮件参数?

转载 作者:行者123 更新时间:2023-11-28 17:55:53 29 4
gpt4 key购买 nike

我正在使用 DRF ViewSet 来管理用户帐户:

class UserViewSet(ModelViewSet):
lookup_field = 'email'
queryset = User.objects.all()

并有一个像这样的测试用例:

from django.urls import reverse
from .base import BaseApiTestCase


class UsersTestCase(BaseApiTestCase):

def test_get_user_account(self):

# ...Create a test user, login as test user...

response = self.client.get(
reverse('api:users-detail', kwargs={'email': 'test@user.com'}),
content_type='application/json'
)
self.assertStatusCode(response, 200)

我得到错误:

django.urls.exceptions.NoReverseMatch: Reverse for 'users-detail' with keyword arguments '{'email': 'test@user.com'}' not found. 2 pattern(s) tried: ['api/users/(?P<email>[^/.]+)\\.(?P<format>[a-z0-9]+)/?$', 'api/users/(?P<email>[^/.]+)/$']

据我了解,[^/.]+ 正则表达式应匹配 test@user.com

虽然 reverse() 应该为我做这件事,但我也尝试过对 @ 符号进行 url 编码,如:

reverse('api:users-account', kwargs={'email': 'test%40user.com'}),

运行 manage.py show_urls 显示 URL 可用:

...
/api/users/<email>/ api.views.users.UserViewSet api:users-detail
...

为什么 django 的 reverse() 系统找不到匹配的 url?

编辑:我在 DRF 的路由器上正常使用 ViewSets,所以 urls.py 不是 super 相关,但对于后代来说,这里是相关部分:

from rest_framework import routers, permissions
from api import views
router = routers.DefaultRouter()
router.register(r'users', views.users.UserViewSet, base_name='users')

最佳答案

问题不在于@,而是.。这是因为 DRF 路由器用于参数的默认正则表达式是 [^/.]+,它专门排除了点。

您应该能够通过在 View 集上设置 lookup_value_regex 来覆盖它:

class UserViewSet(ModelViewSet):
lookup_field = 'email'
lookup_value_regex = r'[^/]+'

关于python - 为什么 django 的 reverse() 不能匹配电子邮件参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58489936/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com