与unittest的NoReverseMatch

问题描述 投票:0回答:1

所以是时候问我的第一个愚蠢的问题了。

有两个简单相同的测试。

    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.

我到底做错了什么?或者说我要反向传递什么参数才能通过测试?

django django-templates django-testing django-i18n
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.