Мне нужно вызвать несколько веб-страниц для извлечения информации для приложения django, а затем отобразить ее, но я не знаю, как правильно ее отобразить.

Моя проблема в том, что когда я вызываю внешнюю веб-страницу и отображаю ее как {{ html }} в цикле for, она печатает для всех из них, есть ли способ печатать только для одного. Часть после b'{"carpark_name": "многоэтажный", "дата": "01-11-21 12:46:55", "spaces_available": 332}' это веб-страница

Это мой views.py

from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
def index(request):
    campus_list = Campus.objects.all()
    carpark_list = Carpark.objects.all()
    noparking = Campus.objects.filter(carpark=None)
    html = urlopen("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").read()
    context = {'carpark_list': carpark_list,
               'campus_list': campus_list,
               'noparking': noparking,
               'html' : html
            }


    return render(request, "parkatdcu/index.html", context)

А это мой код index.html

<h1>Welcome to ParkAtDCU</h1>
   {% for campus in campus_list %}
     <h2>
       {{ campus }}
     </h2>
     {% if campus in noparking %}
        No carparks found
     {% else %}
        <ul>
        {% for carpark in carpark_list %}
           {% if campus == carpark.campus_id %}
              <li> {{ carpark.name }}: {{ carpark.spaces}} spaces, {{carpark.disabled_spaces}} spaces for people with disabilities, {{ html }}</li>
           {% endif %}
        {% endfor %}
        {{ url }}
        </ul>
      {% endif %}
  {% endfor %}

То, что вы получаете - это объект bytes, вы можете декодировать его в объект string и использовать ast.literal_eval() для преобразования его в словарь. А затем передать этот словарь в шаблон. Честно говоря, это объект JSON, и вы не должны называть его HTML. Я дам ему имя data здесь. А затем в шаблоне просто назовите все, что вы хотите показать:

from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
import ast
def index(request):
    campus_list = Campus.objects.all()
    carpark_list = Carpark.objects.all()
    noparking = Campus.objects.filter(carpark=None)
    html = urlopen("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").read()
    data_string = html.decode("utf-8")
    data = ast.literal_eval(test_string)
    context = {'carpark_list': carpark_list,
               'campus_list': campus_list,
               'noparking': noparking,
               'html' : data
            }


    return render(request, "parkatdcu/index.html", context)

И в вашем html-файле:

<h1>Welcome to ParkAtDCU</h1>
   {% for campus in campus_list %}
     <h2>
       {{ campus }}
     </h2>
     {% if campus in noparking %}
        No carparks found
     {% else %}
        <ul>
        {% for carpark in carpark_list %}
           {% if campus == carpark.campus_id %}
              <li> {{ carpark.name }}: {{ carpark.spaces}} spaces, {{carpark.disabled_spaces}} spaces for people with disabilities, car park name: {{ html.carpark_name }}</li>
           {% endif %}
        {% endfor %}
        {{ url }}
        </ul>
      {% endif %}
  {% endfor %}

Но то, как вы это делаете, очень грязно (на мой взгляд). Я предлагаю вам установить requests и использовать requests.get(url).json(), это даст вам словарь, не проходя через эти хлопоты, и сделает ваш код чище (опять же, по моему мнению). Вы можете установить requests:

pip install requests

и сделайте следующее:

from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
import requests
def index(request):
    campus_list = Campus.objects.all()
    carpark_list = Carpark.objects.all()
    noparking = Campus.objects.filter(carpark=None)
    data = requests.get("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").json()
    context = {'carpark_list': carpark_list,
               'campus_list': campus_list,
               'noparking': noparking,
               'html' : data
            }


    return render(request, "parkatdcu/index.html", context)

(я не изменил вашу контекстную переменную html, потому что "если она работает, не трогайте ее", я предлагаю вам изменить имя вашей контекстной переменной "html" на "data" или что-то в этом роде).

Вернуться на верх