Django Redirect by Name - ошибка отсутствия обратного соответствия
Имя моего проекта django - 'exercises', а имя приложения - 'practice'. Это базовое приложение позволяет пользователю переходить на различные страницы с помощью нажатия кнопки. Ссылка на каждую страницу использует следующий href:
{% url 'practice:redirector' project.pk %}
Где practice:redirector указывает на url-путь моего приложения (практика) с именем redirector. Он параметризован первичным ключом страницы, на которую я пытаюсь перенаправить. См. ниже
from django.urls import path
from practice import views
app_name = "practice"
urlpatterns = [
path('', views.all_sites, name="all_sites"),
path('<int:pk>', views.redirector, name='redirector'),
path('clickToAddItems', views.clickToAddItems, name='clickToAddItems'),
path('displayEvens', views.displayEvens, name='displayEvens'),
path('displayMousePosition', views.displayMousePosition, name='displayMousePosition'),
path('luckySevens', views.luckySevens, name='luckySevens'),
]
Этот url указывает на представления внутри практики. Там у меня есть представление, установленное для каждой страницы, которое соответствует имени, которое будет отображаться на странице. У меня также есть представление re director, которое использует pk, переданный в url, чтобы извлечь соответствующую страницу из моей базы данных и использовать имя в качестве аргумента в ярлыке redirect():
from django.shortcuts import render, redirect
from practice.models import Project
app_name = "practice"
# Create your views here.
# Main list of javascript sites
def all_sites(request):
# query my project model to return all site objects
projects = Project.objects.all()
# return a rendered template with the site information passed into it
return render(request, 'practice/all_sites.html', {'projects':projects})
def clickToAddItems(request):
return render(request, 'practice/clickToAddItems')
def displayEvens(request):
return render(request, 'practice/displayEvens')
def displayMousePosition(request):
return render(request, 'practice/displayMousePosition')
def luckySevens(request):
return render(request, 'practice/luckySevens')
def redirector(request, pk):
project = Project.objects.get(pk=pk)
site_name=project.title
return redirect(site_name, permanent=True)
Я ожидаю, что django будет использовать представление redirector для перенаправления в зависимости от предоставленного имени. Используя отладчик, я вижу, что база данных запрашивается правильно и правильное имя передается в редирект с каждым url:
C:\Users\User\my_repository\my_repository\Dev\small-projects\practice\views.py, line 29, in redirector
def luckySevens(request):
return render(request, 'practice/luckySevens')
def redirector(request, pk):
project = Project.objects.get(pk=pk)
site_name=project.title
return redirect(site_name, permanent=True)
# Local vars:
#(These are the local variables tracked by the debugger, not project code)
pk = 1
project = <Project: Project object (1)>
request = <WSGIRequest: GET '/practice/1'>
site_name = 'clickToAddItems'
Однако я получаю ошибку NoReverseMatch, потому что django использует url-файл проекта вместо url-файла моего приложения для поиска соответствующего представления.
C:\Users\User\my_repository\my_repository\Dev\small-projects\venv\lib\site-packages\django\urls\base.py, line 88, in reverse
else:
raise NoReverseMatch("%s is not a registered namespace" % key)
if ns_pattern:
resolver = get_ns_resolver(
ns_pattern, resolver, tuple(ns_converters.items())
)
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs) …
reverse_lazy = lazy(reverse, str)
def clear_url_caches():
# Local vars:
#(These are the local variables tracked by the debugger, not project code)
args = []
current_app = None
current_path = None
kwargs = {}
ns_converters = {}
ns_pattern = ''
path = []
prefix = '/'
resolved_path = []
resolver = <URLResolver 'exercises.urls' (None:None) '^/'>
urlconf = 'exercises.url'
view = 'clickToAddItems'
viewname = 'clickToAddItems'
Мне нужно, чтобы резольвер просматривал 'practice.urls' вместо 'exercises.urls'. Как я могу это сделать? Я пробовал параметризовать urlconf=practice.urls в ярлыке redirect представления редиректора, но это не работает. Любой ответ будет очень признателен! Спасибо :)
если вы хотите перенаправить на
site_name = 'clickToAddItems'
как в вашем примере отладки, вы должны назвать приложение:
site_name = 'practice:clickToAddItems'