为什么Django URL转换器类型不起作用?

时间:2019-09-13 15:49:40

标签: django

我正在尝试编写一个单元测试,该单元测试将测试遵循Django最新的简化URL路由语法的URLconf。此语法允许捕获的值包括转换器类型。但是我发现转换器类型似乎不起作用。

这是我要测试的URLconf:

urlpatterns = [
    path('club/<int:club_id>/', login_required(views.show_club), {'template': 'show_club.html'}, name='show-club'),
    ...
]

如您所见,我想将俱乐部ID传递为整数。现在是我的测试:

class TestURLs(TestCase):

    def test_show_club(self):
        path = reverse('show-club', kwargs={'club_id': 10})
        match = resolve(path)
        assert match.view_name == 'show-club'
        assert 'club_id' in match.kwargs
        assert match.kwargs['club_id'] == 10

运行此测试时,我在第三个断言上收到断言错误:

File... in test_show_club assert match.kwargs['club_id'] == 10
AssertionError

如果我在代码中插入set_trace并检查match变量,则可以看到断言失败,因为club_id键包含字符串值'10':

ResolverMatch(func=activities.views.show_club, args=(), kwargs={'club_id': '10', 'template': 'show_club.html'...})

如果我的转换器类型为<int:club_id>,则kwargs ['club_id']是否应包含整数值10而不是字符串'10'?

我还在代码中插入了一个set_trace,然后通过该视图运行代码。当我做print(type(club_id))时,我还发现传入的值是一个字符串。为什么此整数转换器类型不能像广告中那样工作?我正在使用Django 2.0.13,并且正在升级到Django 2.2。

更新

我感谢Daniel Roseman的回复。如果他说的是正确的,则说明文件似乎不正确。 documentation说,

  

新语法支持URL参数的类型强制。在里面   例如,该视图将接收year关键字参数作为整数   而不是字符串。

是说视图将以整数形式接收参数,而不是字符串。 Wikipedia上的“类型强制”的定义支持:

  

在计算机科学中,类型转换,类型转换,类型   强制和类型变戏法是改变   从一种数据类型到另一种数据类型的表达式。一个例子是   将整数值转换为浮点值或其   文本表示形式为字符串,反之亦然。

也许我只是没有正确阅读它。但是,如果文档不正确,则在测试中检查kwarg的类型毫无意义。

1 个答案:

答案 0 :(得分:0)

不,不是那样的。参数将始终是字符串。转换器仅确保其格式正确,即仅包含数字。

编辑,因为我想我知道混乱的根源。它不是 type 转换器,而是 pattern 转换器。它将<int:club_id>转换为等效的正则表达式(?P<club_id>\d+)