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'
Вернуться на верх