Как правильно сочетать AJAX + функцию представления (вызов API) + отображение URL? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть функция Javascript, которая назначает team_id футбольной команды переменной по «щелчку» названия команд на боковой панели (см. Скриншот ниже). Затем эта переменная должна использоваться для выполнения соответствующего вызова API для получения свежих данных для обновления панели мониторинга в соответствии с запросом. Веб-приложение / панель мониторинга основана на Django.

Сам Javascript плавно назначает переменную, а сама функция views также извлекает данные из API (при использовании URL-адреса Fix API для URL без назначенной переменной).

Чтобы сделать эту тему будущим руководством по схожим вопросам, я разделил содержание по разным вопросам и попытался представить его как можно более аккуратным.

1.)
Теперь, когда я хочу объединить эти шаги, я всегда получаю ошибку TypeError (потому что вызов API не возвращает никаких данных), так как функция views, кажется, не использует назначенную переменную 'team_id' в URL-адресе API (team_idemtpy при отладке = нет данных API в ответ). Почему это?

2.)
Я также попытался изменить логику отображения URL таким образом (что я бы предпочел), чтобы был только один URL, например www.dasocc.com, чтобыотобразить панель управления, и пользователь не будет перенаправлен, если выберет другую футбольную команду на боковой панели. Но здесь у меня есть проблема, связанная с тем, что мне нужно сопоставить функцию вида team_update с index.html, который затем не может быть отображен вообще, потому что не может быть переменной, назначенной на первом месте (парадокс курицы или яйца). Возможно, было бы целесообразно расширить функцию представлений с помощью условного оператора, например («Если не назначено значение team_id, используйте team_id = 70), чтобы избежать пустого вызова API и, следовательно, для веб-сайта для отображения вообще?

3.)
Можно ли активировать функцию представлений team_update, только когда пользователь щелкает команду на боковой панели? Таким образом, я мог бы избежать запуска функции без назначенной переменной team_id.

4.)
Нужно ли использовать функцию успеха AJAX для рендеринга страницы с возвращенными данными, кроме функции представления, которая сама все равно рендерится?

Я так близок к тому, чтобы запустить информационную панель. Я надеюсь, что вы, ребята, сможете помочь мне с последними шагами, чтобы заставить приложение '' click click - API call - dashboard update '' работать.

Ошибка

TypeError at /dashboard/
list indices must be integers or slices, not str
Request Method: GET
Request URL:    http://127.0.0.1:8000/dashboard/
Django Version: 2.2.5
Exception Type: TypeError
Exception Value:    
list indices must be integers or slices, not str
Exception Location: C:\Users\Jonas Blickle\Desktop\dasocc\dasocc_site\dasocc_app\views.py in team_update, line 16
Python Executable:  C:\Users\JONASB~1\Envs\DASOCC~1\Scripts\python.exe
Python Version: 3.7.4
Python Path:    
['C:\\Users\\Jonas\\Desktop\\dasocc\\dasocc_site',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1\\Scripts\\python37.zip',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1\\DLLs',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1\\lib',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1\\Scripts',
 'c:\\users\\jonas\\appdata\\local\\programs\\python\\python37-32\\Lib',
 'c:\\users\\jonas '
 'blickle\\appdata\\local\\programs\\python\\python37-32\\DLLs',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1',
 'C:\\Users\\JONASB~1\\Envs\\DASOCC~1\\lib\\site-packages']
Server time:    Wed, 2 Oct 2019 12:27:08 -0500

Javascript / AJAX:

$('ul.subbar li a').on('click', function(e) {
var team_id = $(this).attr("id");
console.log(team_id);
$.ajax({
  method: "GET",
  url: "/dashboard/",
  data: {'team': team_id},
  success: function() {

    }
  });
});

views.py функция

import requests
from django.shortcuts import render
import json

def team_update(request):
    team_id = request.GET.get('team')
    response = requests.get(f'http://www.api-football.com/demo/api/v2/teams/team/{team_id}')
    team_data = response.json()
    teams = team_data.get('api', {}).get('teams', [])
    if teams and len(teams) == 1:
        teams = teams[0]
    return render(request, 'index.html', {
        'name': teams['name'],
        'country': teams['country'],
        'founded': teams['founded'],
        'logo': teams['logo'],
        'venue_capacity': teams['venue_capacity'],
    })

Отображение URL

from dasocc_app import views
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^$', views.render_landing_page, name='landing_page'),
    url(r'admin/', admin.site.urls),
    url(r'about/', views.render_about),
    url(r'dashboard/', views.team_update, name='team'),
    url(r'dasocc_app/', include('dasocc_app.urls'))
]

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...