Страница не загружается даже после статуса 200
Я пытаюсь перенаправить на страницу счета, но ничего не меняется, кроме обновления
это url.py
urlpatterns = [
path('', User_login_view, name='login'),
path('home/', HomePageView.as_view(), name='home'),
path("nglm/", NGLMView.as_view() , name="nglm"),
""" other urls for the sidebar"""
path("createinvoice/", NGLINVAPI.as_view(), name="createinvoice"),
path("nglinvoice/", NGLInvoiceTV.as_view(), name="nglinvoice")
]
После входа в систему я перехожу на страницу "nglm", где ввожу данные клиента и нажимаю кнопку submit, которая вызывает api "createinvoice". класс показан ниже
class NGLINVAPI(APIView):
def post(self,request):
if 'nglinv' == request.POST['formtype'] :
data = {
'name': request.data['cname'],
'civilid': request.data['civilid'],
'ph':request.data['ph'],
'disc':request.data['disc'],
'bookno':request.data['Bookno'],
'tga':request.data['LAmount'],
}
p,ccreated = update_customerdb(data=data)
l = update_gldb(data=data)
data['cid'] = p.id
iq,i = update_inventory(data=data,gl=l)
lici = update_LICI(cid=p,lid=l,data=data)
ninv = update_invoice(licid=lici,lid=l,cid=p,data=data,il = iq,items = i)
invid = ninv.id
NGLItemModel.objects.all().delete()
base_url = '/nglinvoice/'
query_string = urlencode({'pk': ninv.pk})
url = '{}?{}'.format(base_url, query_string)
return redirect(url)
return HttpResponseRedirect('home')
это должно было перенаправить меня на страницу счета-фактуры "nglinvoice". вид показан ниже
class NGLInvoiceTV(TemplateView):
template_name = "pages/nglinvoice.html"
def get(self, request):
p = request.GET['pk']
inv = get_object_or_404(InvoiceModel, pk=p)
context = {}
context['segment'] = 'api'
context['pagename'] = 'New GL API'
context['object'] = inv
return render(request,self.template_name , context)
У меня нет проблем до этого момента. проблема в том, что он не показывает страницу "nglinvoice.html", он просто обновляет страницу "nglm"
ниже показано, что показывает терминал
Проверка системы не выявила проблем (0 промолчало).
15 мая, 2022 - 16:47:28
.
Django версии 3.2.9, использование настроек 'mysite.settings'
Запуск сервера разработки по адресу http://127.0.0.1:8000/
.
Выйдите из сервера с помощью CTRL-BREAK.
[15/May/2022 16:47:53] "GET / HTTP/1.1" 200 4103
[15/May/2022 16:47:55] "POST / HTTP/1.1" 302 0
[15/May/2022 16:47:55] "GET /home/ HTTP/1.1" 200 23840
[15/May/2022 16:47:58] "GET /nglm/ HTTP/1.1" 200 24028
[15/May/2022 16:47:58] "GET /itemlist/ HTTP/1.1" 200 2
[15/May/2022 16:48:02] "POST /additem/ HTTP/1.1" 302 0
[15/May/2022 16:48:02] "GET /nglm/ HTTP/1.1" 200 24028
[15/May/2022 16:48:02] "GET /itemlist/ HTTP/1.1" 200 2
[15/May/2022 16:48:23] "POST /additem/ HTTP/1.1" 200 8
[15/May/2022 16:48:23] "GET /itemlist/ HTTP/1.1" 200 104
[15/May/2022 16:48:34] "GET /apicheck/?term=p HTTP/1.1" 200 17
[15/May/2022 16:48:35] "GET /get_customerdetails/?k=PETER+JOHNSON&t=n HTTP/1.1" 200 102
.
[15/May/2022 16:48:38] "POST /createinvoice/ HTTP/1.1" 302 0
[15/May/2022 16:48:38] "GET /nglinvoice/?pk=5 HTTP/1.1" 200 13863
если я ввожу последний url вручную, я вижу страницу
Побочная заметка, слишком длинная для комментария.
Диспетчеризация URL выполняется не по-Django, не по-REST. Почему /nglinvoice/?pk=5? Это приводит к лишнему "look around" коду, изобретающему встроенные функции django, доступные из коробки.
Вместо этого:
# urls
urlpatterns = [
path("nglinvoice/", NGLInvoiceTV.as_view(), name="nglinvoice")
]
# view
base_url = '/nglinvoice/'
query_string = urlencode({'pk': ninv.pk})
url = '{}?{}'.format(base_url, query_string)
попробуйте это:
# urls
urlpatterns = [
path("nglinvoice/<int:pk>/", NGLInvoiceTV.as_view(), name="nglinvoice")
]
# view
url = reverse('nglinvoice', args=(ninv.pk, ))
вот пример из документации именно с redirect.
Вместо общего TemplateView попробуйте более конкретный и связанный с тем, что происходит в вашем коде DetailView. Он автоматически получит запрошенную запись.
Я написал об этом на форуме Django, и мне предложили заставить JavaScript перенаправлять вместо APIView, и это начало работать
https://forum.djangoproject.com/t/page-not-loading-even-after-200-status/13777/4
Так что я сделал несколько изменений
На мой взгляд:
class NGLINVAPI(APIView):
def post(self,request):
if 'nglinv' == request.POST['formtype'] :
"""Blah Blah Blah """
url = url = reverse('nglinvoice', args=(ninv.pk, ))
return JsonResponse({'url':url},safe=False)
return HttpResponseRedirect('home')
и в моем ajax успех
success: function (response) {
window.location.href = response.url
},