NoReverseMatch 除非 Url 在主项目 Urls.py 中

NoReverseMatch Unless Url Is In Main Project Urls.py

我有一个名为 'my_project' 的项目,在该项目中我有一个名为 'my_app' 的应用程序,所以我有两个 urls.py 文件。 my_app 的所有 url 都位于它的 urls.py 文件中并且可以正常工作,除了一个。那个是'download_file'。当它包含在 my_project 的 urls.py 中时,我的网站可以正常工作,但是当它包含在 my_app 的 urls.py 中时,我在页面加载时遇到 NoReverseMatch 错误。

我不知道为什么这个 url 只有在我的主要项目 url 的文件夹中才有效。我怀疑它与正则表达式有关,但我无法弄清楚。

用户将在此页面上:

http://127.0.0.1:8000/user_area/username/classes

然后点击 'download' link:

<a href="{% url 'download_file' file_path=item.instance.user_file %}" target='_blank'>{{ item.instance.filename }}</a>

my_project.py

urlpatterns = [
# reference to my_app
re_path(r'^user_area/(?P<username>[\w-]+)/', include('my_app.urls')),
]

# this works
url(r'^download_file/(?P<file_path>(.+)\/([^/]+))$', users_views.DownloadFile.as_view(), name='download_file'),
]

my_app.py

urlpatterns = [
path('classes', views.classes, name='classes'),

# if I remove the url from my_project.py this one returns NoReverseMatch on page load
url(r'^download_file/(?P<file_path>(.+)\/([^/]+))$', users_views.DownloadFile.as_view(), name='download_file'),

谢谢。

出现问题是因为您的 URL template tag 只提供了一个参数:file_path

当 URL 在您的项目 urls.py 中声明时,这有效,因为只需要一个参数。

当您尝试在my_app.urls中使用URL时,您还需要提供username参数。您将需要使用类似:

<a href="{% url 'download_file' username=request.user.username file_path=item.instance.user_file %}" target='_blank'>{{ item.instance.filename }}</a>