我正在尝试测试非登录用户重定向到登录url。有没有一种方法可以通过传递get参数(例如“next”)来反转\u lazy?我使用的是基于类的视图
class SecretIndexViewTest(TestCase):
url = reverse_lazy('secret_index')
login_url = reverse_lazy('login')
client = Client()
def test_http_status_code_302(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, self.login_url,)
以上内容与
Response redirected to '/login?next=/secret', expected '/login'Expected '/login?next=/secret' to equal '/login'.
尝试
class SecretIndexViewTest(TestCase):
url = reverse_lazy('secret_index')
login_url = reverse_lazy('login', kwargs={'next': url)
client = Client()
def test_http_status_code_302(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, self.login_url,)
结果是没有反向匹配
django.urls.exceptions.NoReverseMatch: Reverse for 'login' with keyword arguments '{'next': '/secret'}' not found. 1 pattern(s) tried: ['/login$']
将kwargs更改为args将导致相同的错误
我知道我可以处理以下问题,但我正在寻找更好的解决方案
self.assertRedirects(response, self.login_url + f"?next={self.url}",)
或
login_url = reverse_lazy('login') + f"?next={url}"
由于mentioned in the Django documentation、
reverse
(和reverse_lazy
)不包含GET参数,因此字符串格式示例是最简单的解决方案之一如果您担心对查询字符串进行编码,那么可以使用^{} module 中的工具(如
urllib.parse.urlencode
)对查询进行编码,然后通过连接reverse
的路径和编码的查询参数来构建完整的URL对于像测试这样的简单情况,您确切地知道传递的数据是什么,我倾向于使用简单的字符串格式
相关问题 更多 >
编程相关推荐