NoReverseMatch, если URL-адрес не находится в основном проекте Urls.py - PullRequest
0 голосов
/ 12 июля 2020

У меня есть проект под названием «my_project», и в этом проекте у меня есть приложение под названием «my_app», поэтому у меня есть два файла urls.py. Все мои URL-адреса для my_app находятся в файле urls.py и работают правильно, кроме одного. Это файл "download_file". Мой сайт работает, когда он включен в urls.py my_project, но когда он находится в urls.py my_app, я получаю NoReverseMatch ошибку при загрузке страницы.

Я не знаю, почему этот URL работает только тогда, когда он находится в папке url моего основного проекта. Я подозреваю, что это как-то связано с регулярным выражением, хотя я не могу этого понять.

Пользователь будет на этой странице:

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

затем щелкните ссылку «скачать» :

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

Спасибо.

1 Ответ

0 голосов
/ 12 июля 2020

Проблема возникает из-за того, что ваш тег шаблона URL предоставляет только один параметр: file_path.

Это работает, когда URL-адрес объявлен в вашем проекте urls.py, потому что только необходим один параметр.

Когда вы пытаетесь использовать URL-адрес в my_app.urls, вам также необходимо указать параметр username. Вам нужно будет использовать что-то вроде:

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