首页 > 解决方案 > 我必须调用多个网页来提取 django 应用程序的信息,然后显示它,但我不知道如何正确显示

问题描述

我的问题是,当我调用外部网页并在 for 循环中显示为 {{ html }} 时,它会为所有这些网页打印,有没有办法只为一个网页打印。b'{"carpark_name": "multi-storey", "date": "01-11-21 12:46:55", "spaces_available": 332}' 之后的 部分是网页

这是我的意见.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 %}

标签: pythonhtmldjangoloopsview

解决方案


你得到的是一个字节对象,你可以将它解码成一个字符串对象并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”或类似的名称)。


推荐阅读