首页 > 解决方案 > Twitter/Reddit 帖子未正确嵌入 Django 模板

问题描述

我正在建立一个新闻聚合器。我通过 tweepy 和 PRAW 库连接到 twitter 和 reddit API。我正在从 twitter 和 reddit 中提取 json 数据,并以时间线格式并排显示帖子。

我有一个名为 main.html 的模板,它接受上下文(reddit post ids; twitter status urls)并将该上下文传递给模板标签,以便生成要嵌入的 html。这是完成所有这些工作的模板。模板标签是“tweet_tags.py”和“red_attempt.py”,您可以在页面顶部看到加载。

{% block content %}{% load red_attempt %} {% load tweet_tags %} {% autoescape off %}
<h1>Welcome</h1>
<a href="/main" class="btn btn-danger">Refresh News</a>
<div class="container">
  <div class="row">
    <div class="col-6">
      <h3 class='text-center'>Reddit News</h3>
      {% for item in reddit %}
      <div class="mdl-card__media" id="timeline"></div>
        {% red_attempt item %}
      <br>
      {% endfor %}
    </div>
    <div class="col-6">
      <h3 class='text-center'>Twitter News</h3>
      {% for item in twitter %}
      <div class="mdl-card__media" id="timeline"></div>
        {% tweet_tags item %}
      <br>
      {% endfor %}
    </div>
  </div>
</div>
{% endautoescape %}{% endblock %}

模板标签是“tweet_tags.py”和“red_attempt.py”,您可以在页面顶部看到加载。

这是他们的代码,分别是:

推文标签.py

def tweet_tags(url):  
    """ Requests a tweet from oembed and returns the html element """

    tweet_request = requests.get(
        'https://publish.twitter.com/oembed?url=' + url + '&omit_script=true')
    tweet_json = tweet_request.json()
    tweet_html = tweet_json['html']

    return tweet_html  # returns to our template

red_attempt.py

def red_attempt(url):  
    """ Requests a tweet from oembed and returns the html element """

    headers = {
        'User-Agent': 'nba_comp app',
        'From': 'nickiscool88',
        'Accept': 'application/json'  
    }

    endpoint = requests.get(
        f"https://www.reddit.com/oembed?url=https://www.reddit.com{url}", headers=headers)

    return endpoint.json()['html']

这一切都按预期工作。

相反,我想做的是让服务脚本提取 twitter 和 reddit 数据,使用 models.py 将该数据存储在我的数据库中,然后从本地数据库中提取数据以显示。我试图在这个脚本test.html中做到这一点

{% block content %} {% autoescape off %}

{% for post in all %}
  <div class="mdl-card__media" id="timeline"></div>
  <p>{{ post.html }}</p>
</div>
{% endfor %} {% endautoescape %}{% endblock %}

在这种情况下,“all”是上下文,它是来自 models.py 的数据库对象。这是我的 models.py 脚本。

class Post(models.Model):
    post_type = models.CharField(
        max_length=20, null=True, blank=True)
    root_url = models.CharField(max_length=200, default="", unique=True)
    html = models.TextField(default="")
    created_at = models.DateTimeField(auto_now_add=True)

如您所见,我正在尝试遍历数据库中的所有帖子,并发布每个帖子的 html。我期待与 main.html 相同的结果,但相反,它看起来像这样测试.html


与看起来像这样的 main.html 相反

在此处输入图像描述

所有支持嵌入的脚本/小部件标签都位于 HTML 模板的底部。

我如何在 test.html 中显示我的数据库中的这些 twitter/reddit 帖子,类似于我如何像 main.html 那样显示它们,我只是在其中获取 json 数据?

标签: pythondjangomodel-view-controllertweepypraw

解决方案


问题解决了。用于嵌入 twitter/reddit 帖子的脚本标签需要在标签内。


推荐阅读