【问题标题】:Why django template is not showing any output?为什么 django 模板没有显示任何输出?
【发布时间】:2020-05-21 06:11:16
【问题描述】:

所以,我在这里使用 django 编写了一个简单的新闻应用程序,但模板似乎不起作用,它没有显示从 views.py 传递的任何输出。 我已经检查了 settings.py,INSTALLED_APPS 设置它的工作原理

views.py

from django.shortcuts import render,HttpResponse

import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen


def get_news():
    news_link = "https://news.google.com/news/rss"
    page = urlopen(news_link)
    xml_page = page.read()
    page.close()

    soup_page = soup(xml_page,"xml")
    news_list = soup_page.findAll("item")
    return news_list



def index(request):
    news_list = get_news()
    return render(request,'main/index.html',{'news_list' : news_list})

和模板

    {% for news in news_list %}
    <h3> {{ news.title.text }} </h3>
    <h3> {{ news.pubDate.text }} </h3>
    {% endfor %}

如果我从 render() 字典中传递任何其他数据,它可以工作,但是在传递列表时,它不会在模板中显示任何数据

我尝试检查列表是否为无或为空,但不,它不为空。 谢谢!

【问题讨论】:

  • 我无法重现该问题,因为 urlopen(news_link) 对我来说失败了。使用 python requests 库,我可以获取 news_list 并且据我所知,您的代码应该可以工作(除了它应该是 find_all() 而不是 findAllnews.pubdate 而不是 news.pubDate。在您的索引视图中,尝试打印[news.title for news in news_list] 以确保。

标签: python django python-3.x django-templates django-views


【解决方案1】:

你得到了类似(__str__ of bs4.element.Tag 实例):

<title>lorem ipsum, dolor...</title>, <link>https://news.google.com/__i/rss/rd/articles/CBMiaGh0dHBzOi8vd3d3LmNubi5jb20vMjAyMC8wMi8wNS9wb2xpdGljcy9kb25hbGQtdHJ1bXAtbmFuY3ktcGVsb3NpLXN0YXRlLW9mLXRoZS11bmlvbi1hbmFseXNpcy9pbmRleC5odG1s0gFsaHR0cHM6Ly9hbXAuY25uLmNvbS9jbm4vMjAyMC8wMi8wNS9wb2xpdGljcy9kb25hbGQtdHJ1bXAtbmFuY3ktcGVsb3NpLXN0YXRlLW9mLXRoZS11bmlvbi1hbmFseXNpcy9pbmRleC5odG1s?oc=5</link>, <guid isPermaLink="false">52780574934659</guid>, <pubDate>Wed, 05 Feb 2020 08:15:00 GMT</pubDate>, <description>&lt;ol&gt;&lt;li&gt;&lt;a href="https://news.google.com/__i/rss/rd/articles/CBMiaGh0dHBzOi8vd3d3LmNubi5jb20vMjAyMC8wMi8wNS9wb2xpdGljcy9kb25hbGQtdHJ1bXAtbmFuY3ktcGVsb3NpLXN0YXRlLW9mLXRoZS11bmlvbi1hbmFseXNpcy9pbmRleC5odG1s0gFsaHR0cHM6Ly9hbXAuY25uLmNvbS9jbm4vMjAyMC8wMi8wNS9wb2xpdGljcy9kb25hbGQtdHJ1bXAtbmFuY3ktcGVsb3NpLXN0YXRlLW9mLXRoZS11bmlvbi1hbmFseXNpcy9pbmRleC5odG1s?oc=5" target="_blank"&gt;Trump makes dazzling, divisive reelection pitch in State of the Union&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#6f6f6f"&gt;CNN&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://news.google.com/__i/rss/rd/articles/CBMiK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9QlNnYzd3dWlOMzDSAQA?oc=5" target="_blank"&gt;Nancy Pelosi rips up Trump's State of the Union speech&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#6f6f6f"&gt;CNN&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://news.google.com/__i/rss/rd/articles/CBMiZWh0dHBzOi8vd3d3Lm5iY25ld3MuY29tL3RoaW5rL29waW5pb24vc3RhdGUtdW5pb24taXNuLXQtc3Ryb25nLXRydW1wLXByZXRlbmRzLWl0LXMtYmV0dGVyLW5jbmExMTI5OTIx0gEtaHR0cHM6Ly93d3cubmJjbmV3cy5jb20vdGhpbmsvYW1wL25jbmExMTI5OTIx?oc=5" target="_blank"&gt;The state of the union isn't as strong as Trump pretends, but it's better than Democrats say&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#6f6f6f"&gt;NBC News&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://news.google.com/__i/rss/rd/articles/CBMicWh0dHBzOi8vbnlwb3N0LmNvbS8yMDIwLzAyLzA1L3N0YXRlLW9mLXRoZS11bmlvbi1hZGRyZXNzLXRydW1wLWhpdHMtZ3JhbmQtc2xhbS13aGlsZS1wZWxvc2ktanVzdC1sb29rcy1sb29rcy1zYWQv0gF1aHR0cHM6Ly9ueXBvc3QuY29tLzIwMjAvMDIvMDUvc3RhdGUtb2YtdGhlLXVuaW9uLWFkZHJlc3MtdHJ1bXAtaGl0cy1ncmFuZC1zbGFtLXdoaWxlLXBlbG9zaS1qdXN0LWxvb2tzLWxvb2tzLXNhZC9hbXAv?oc=5" target="_blank"&gt;State of the Union address: Trump hits grand slam, while Pelosi just looks looks sad&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#6f6f6f"&gt;New York Post &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://news.google.com/__i/rss/rd/articles/CBMiZmh0dHBzOi8vd3d3LmZveG5ld3MuY29tL29waW5pb24vbGVzbGllLW1hcnNoYWxsLXNvdHUtYWRkcmVzcy1jb250aW51ZXMtdHJ1bXBzLXJvbGUtYXMtZGl2aWRlci1pbi1jaGllZtIBamh0dHBzOi8vd3d3LmZveG5ld3MuY29tL29waW5pb24vbGVzbGllLW1hcnNoYWxsLXNvdHUtYWRkcmVzcy1jb250aW51ZXMtdHJ1bXBzLXJvbGUtYXMtZGl2aWRlci1pbi1jaGllZi5hbXA?oc=5" target="_blank"&gt;Leslie Marshall: SOTU address continues Trump’s role as divider in chief&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#6f6f6f"&gt;Fox News&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://news.google.com/stories/CAAqOQgKIjNDQklTSURvSmMzUnZjbmt0TXpZd1NoTUtFUWlEamE3N2pvQU1FU1YxUEo2emxrYWRLQUFQAQ?oc=5" target="_blank"&gt;View full coverage on Google News&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;</description>, <source url="https://www.cnn.com">CNN</source>

存储在news

您无法使用{{ news.title.text }} 访问此实例。这就是您最终在模板中得到空结果的原因。试试 {{ news }} 你会看到里面有什么。

您可以创建一个自定义模板过滤器,它可以从该实例中提取必要的数据 --> https://docs.djangoproject.com/en/3.0/howto/custom-template-tags/

或者你将get_news方法中的数据准备成python结构list of dicts

工作示例:

def get_news():
    news_link = "https://news.google.com/news/rss"
    page = urlopen(news_link)
    xml_page = page.read()
    page.close()

    soup_page = soup(xml_page, "xml")
    news_list = map(
        lambda item: {'title': item.title.text, 'date': item.pubDate.text},
        soup_page.findAll("item"))
    return news_list

在模板中:

    {% for news in news_list %}
        <h3> {{ news.title }} </h3>
        <h3> {{ news.date }} </h3>
    {% endfor %}

【讨论】:

  • OP 正在使用 BeautifulSoup,所以 news 是一个 BeautifulSoup 对象(不是字符串),是的,您可以使用带有 news.title 的标签名称访问节点
  • Yes in Python news.title 确实有效,但我在模板中运行代码 {{ news.title }} 无效。我更新了答案,因为您看到实例的字符串表示不是字符串。我仍然建议在后端构建所需的结构
  • 我添加了一个工作示例,说明数据结构的外观。
【解决方案2】:

news_list 中,您将获得&lt;class 'bs4.element.ResultSet'&gt; 美丽的汤对象,这就是为什么您可以在视图中打印它而不能在模板中使用它。

您可以使用 feedparser 模块作为替代。

import feedparser
news_link = "https://news.google.com/news/rss"
print(feedparser.parse(news_link))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多