所以是时候问我的第一个愚蠢的问题了。
有两个简单相同的测试。
def test_home_page_status_code(self):
response = self.client.get('/en/')
self.assertEquals(response.status_code, 200)
def test_view_url_by_name(self):
response = self.client.get(reverse('web:home'))
self.assertEquals(response.status_code, 200)
有两个简单的urls配置。
...
urlpatterns = i18n_patterns(
path('', include('web.urls', namespace='web')),
)
...
...
app_name = 'web'
urlpatterns = [
path('', views.HomePageView.as_view(), name='home'),
]
...
还有一部分代码在模板中。
{% for lang_code, lang_name in languages %}
{% language lang_code %}
<a class="dropdown-item" href="{% url request.resolver_match.view_name %}">{{ lang_name }}</a>
{% endlanguage %}
{% endfor %}
如果我在模板中注释这段代码,两个测试都会通过;如果我离开这段代码,反向测试就会失败。
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for '' not found. '' is not a valid view function or pattern name.
我到底做错了什么?或者说我要反向传递什么参数才能通过测试?
reverse('web:home')
是使用你的应用程序中的URLConf的命名空间和模式中的url名称来知道去向。
除非你的home的url模式是用'web'来命名空间的。
app_name = 'web' # Namespace
urlpatterns = [
path('', views.HomePageView.as_view(), name='home'),
]
反过来就找不到哪里 web:home
def test_view_url_by_name(self):
response = self.client.get(reverse('web:home'))
self.assertEquals(response.status_code, 200)