Мне нужно вызвать несколько веб-страниц для извлечения информации для приложения 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" или что-то в этом роде).