为什么这两个断言有效:
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的返回值有什么区别,为什么它们不同?
答案 0 :(得分:3)
延迟函数的实现不会直接在实例化上返回值,而是返回一个代理对象。当对该对象的特定调用发生时,其实际值将被评估并返回。
如果是reverse_lazy
,您可以在自己的示例中看到这一点:
str(reverse_lazy('upload_booth'))
这是对代理对象__str__
方法的调用,然后真正返回字符串而不是代理对象。
所有实施细节均可在Django docs.
找到