2014-05-18 72 views
2

爲什麼這兩個斷言工作:爲什麼assertRedirects()期望一個字符串而不是一個URL?

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

而不是產生此錯誤消息:

File "/usr/local/lib/python2.7/dist-packages/django/test/testcases.py", line 300, in assertRedirects e_query, e_fragment))
File "/usr/lib/python2.7/urlparse.py", line 234, in urlunsplit url = '//' + (netloc or '') + url TypeError: coercing to Unicode: need string or buffer, proxy found

究竟是返回值的差異來自reverse和reverse_lazy,以及它們爲什麼不同?

回答

3

懶惰函數的實現不要直接在實例化上返回值,而是返回一個代理對象。作爲對這個對象的具體調用發生它的真實值得到評估和返回。

reverse_lazy情況下,你可以在自己的例子來看看這個:

str(reverse_lazy('upload_booth')) 

這是代理對象的__str__方法的調用,然後真的返回一個字符串,而不是一個代理對象。

所有的實施細節可以在Django docs.

相關問題