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