为什么assertRedirects()期望字符串而不是URL?

时间:2014-05-18 07:00:50

标签: django django-testing

为什么这两个断言有效:

from django.test import TestCase

class MyTests(TestCase):
    def test_1(self):
        response = self.client.get(reverse_lazy('create_cm')) 
        self.assertRedirects(response, reverse('upload_booth'))
        self.assertRedirects(response, str(reverse_lazy('upload_booth')))

但这并不是:

self.assertRedirects(response, reverse_lazy('upload_booth'))

而是产生此错误消息:

  

文件   " /usr/local/lib/python2.7/dist-packages/django/test/testcases.py" ;,   第300行,在assertRedirects中       e_query,e_fragment))
  文件" /usr/lib/python2.7/urlparse.py" ;,第234行,在urlunsplit       url =' //' +(netloc或'')+ url TypeError:强制转换为Unicode:需要字符串或缓冲区,代理找到

reverse和reverse_lazy的返回值有什么区别,为什么它们不同?

1 个答案:

答案 0 :(得分:3)

延迟函数的实现不会直接在实例化上返回值,而是返回一个代理对象。当对该对象的特定调用发生时,其实际值将被评估并返回。

如果是reverse_lazy,您可以在自己的示例中看到这一点:

str(reverse_lazy('upload_booth'))

这是对代理对象__str__方法的调用,然后真正返回字符串而不是代理对象。

所有实施细节均可在Django docs.

找到