Django HTTPResponseRedirect не перенаправляет на url, а добавляет целое число к url

Это мой файл view.py

from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound, Http404, HttpResponsePermanentRedirect
from django.urls import reverse
from django.shortcuts import render

articles = {
    'sports': 'sports page',
    'finance' : 'finance page',
    'tech' : 'tech page',
}

def home_view(request):
    return HttpResponse("My App Home Page")

def news_view(request, topic):
    try:
        result = articles[topic]
        return HttpResponse(result)
    except:
        raise Http404("404 Generic view error")


def mul_view(request,num1,num2):
    num_result = num1 * num2
    result = f"{num1} * {num2} = {num_result}"
    return HttpResponse(str(result))

def num_page_view(request, num_page):
    topic_list = list(articles.keys())
    topic = topic_list[num_page]
    return HttpResponseRedirect(topic)

а это мой url-файл приложения

from django.urls import path
from . import views

urlpatterns = [
    path('<int:num_page>/', views.num_page_view, name='num_page'),
    # path('', views.home_view, name='home'),
    path('<topic>/', views.news_view, name='topic-page'),
    path('<int:num1>/<int:num2>/', views.mul_view, name='multiply'),  
]

То, что здесь происходит, мне трудно объяснить, поскольку английский не является моим родным языком. но вот моя лучшая попытка.

Я создал функцию num_page_view, которая принимает число в качестве параметра и имеет список всех ключей словаря статей, затем число предоставляется списку в качестве индекса и сохраняется в переменной topic, которая затем отправляется в качестве вывода в HttpResponseRedirect

Затем я добавил новый путь, который принимает ссылки на num_page_view, но вместо того, чтобы перенаправлять их на тему, он скорее конкатенирует целое число в url с темой

Например,

my_app/1/ должен возвращать my_app/finance, но вместо этого он присоединяет это число к url и делает его my_app/1/finance, хотя я использую HttpResponseRedirect, который по логике должен возвращать заданное имя url, которое я предоставляю ему через переменную topic

Это потому, что он перенаправляет на finance, который является относительным путем, поэтому он будет добавлять finance/ к URL.

Вы можете использовать:

def num_page_view(request, num_page):
    topic_list = list(articles.keys())
    topic = topic_list[num_page]
    return HttpResponseRedirect(f'/my_app/{topic}')

но более надежным способом является использование redirect(…) [Django-doc]:

from django.shortcuts import redirect


def num_page_view(request, num_page):
    topic_list = list(articles.keys())
    topic = topic_list[num_page]
    return redirect('topic-page', topic=topic)

Вместо того чтобы полагаться на индекс topic_list для получения темы, вы можете получить прямой доступ к теме, используя num_page в качестве ключа. Таким образом, вы избежите путаницы с шаблонами URL и напрямую сконструируете URL, используя тему, полученную из словаря, так:

from django.shortcuts import redirect
from django.urls import reverse
from django.http import HttpResponseRedirect

def num_page_view(request, num_page):
    topic_list = list(articles.keys())
    if num_page < len(topic_list):
        topic = topic_list[num_page]
        return HttpResponseRedirect(reverse('topic-page', kwargs={'topic': topic}))
    else:
        # Handle invalid page numbers
        return redirect('home')
Вернуться на верх