2017-07-27 11 views
1

Goodreads APIをDjangoプロジェクトで使用しようとしています。私は、reviews_widgetを抽出する簡単なタグをセットアップし、cssスタイルとhtmlをテンプレートに送信しようとしています。ただし、styleとhtmlは送信時に登録されていません。 {{reviews_widget}}を使用すると、スタイルとHTMLが文字列として表示されますが、{%load reviews_widget%}には何も表示されません。Goodreads APIとDjango

book.html

{% extends "base.html"%} 


{% block content %} 

<!-- Does not render --> 
    {% load reviews_widget %} 

<!-- Shows response in string format --> 
    {{ reviews_widget }} 

<!-- What is sent to template--> 
<!-- 
<style> #goodreads-widget { font-family: georgia, serif; padding: 18px 0; width:565px; } 
#goodreads-widget h1 { font-weight:normal; font-size: 16px; border-bottom: 1px solid #BBB596; 
margin-bottom: 0; } #goodreads-widget a { text-decoration: none; color:#660; } 
iframe{ background-color: #fff; } #goodreads-widget a:hover { text-decoration: underline; } 
#goodreads-widget a:active { color:#660; } #gr_footer { width: 100%; border-top: 1px solid #BBB596; 
text-align: right; } #goodreads-widget .gr_branding{ color: #382110; font-size: 11px; 
text-decoration: none; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } </style> 
<div id="goodreads-widget"> <div id="gr_header"><h1><a href="https://www.goodreads.com/book/show/31430654-the-millionaire-booklet"> 
The Millionaire Booklet Reviews</a></h1></div> <iframe id="the_iframe" 
src="https://www.goodreads.com/api/reviews_widget_iframe?did=DEVELOPER_ID&amp;format=html&amp;isbn=0990355454&amp;links=660&amp;min_rating=&amp;review_back=fff&amp;stars=000&amp;text=000" 
width="565" height="400" frameborder="0"></iframe> <div id="gr_footer"> <a class="gr_branding" 
target="_blank" href="https://www.goodreads.com/book/show/31430654-the-millionaire-booklet?utm_medium=api&amp;utm_source=reviews_widget"> 
Reviews from Goodreads.com</a> </div> </div> 
--> 

{% endblock %} 

views.py

from django.shortcuts import render 
from givegetapp.models import Give, Get, Reader 

# For GoodReads Api 
from django.http import HttpResponse 
from django.template import Context, loader 
from django.http import HttpRequest 
import xml.etree.ElementTree as ET 
import sys 
import requests 

from django import template 
register = template.Library() 


try: 
    import urllib.request as urllib2 
except ImportError: 
    import urllib2 

def book(): 


    isbn = '0990355454' 

    key = 'devKEY' #replaced w/ dev key 

    response = requests.get('https://www.goodreads.com/book/isbn/'+isbn+'?key='+key) 

    tree = ET.fromstring(response.content) 

    reviews_widget = str 

    for leaves in tree[1]: 

     if leaves.tag == "reviews_widget": 
      print(str(leaves.text)) 
      reviews_widget = str(leaves.text) 

    return render(request, "book.html", {"reviews_widget": reviews_widget}) 

templatetags/reviews_widget.py

from django import template 

# For GoodReads Api 
from django.http import HttpResponse 
from django.template import Context, loader 
from django.http import HttpRequest 
import xml.etree.ElementTree as ET 
import sys 
import requests 

from django import template 
register = template.Library() 


try: 
    import urllib.request as urllib2 
except ImportError: 
    import urllib2 
# end of GoodReads 


register = template.Library() 

@register.simple_tag() 
def reviews_widget(): 
    isbn = '0990355454' 

    key = 'g6mDefuBPg0ajE7c4Nwyg' #replace it with your developer key 

    response = requests.get('https://www.goodreads.com/book/isbn/'+isbn+'?key='+key) 

    tree = ET.fromstring(response.content) 

    reviews_widget = str 

    for leaves in tree[1]: 

     if leaves.tag == "reviews_widget": 
      # print(str(leaves.text)) 
      reviews_widget = str(leaves.text) 
    # print(reviews_widget) 
    return {'reviews_widget': reviews_widget} 

スタイルはheadセクションにする必要があるため、私は私がする考え出し応答を異なる変数に分割する必要があります。これをやり遂げるにはどうすればいいですか?また、テンプレートではレスポンスを文字列ではなくhtmlとしてどのように扱うことができますか?

答えて

2

分割 あなたはこのような何か行うことができます。

first_part = response_html.split("</style>")[0] + "</style>" 
second_part = response_html.split("</style>")[1] 

をし、HTMLとしてではなく文字列としてレンダリングテンプレートコンテキスト変数として

return render(request, "book.html", { 
    "style_section": first_part, 
    "content_section": second_part, 
    "reviews_widget": reviews_widget, 
}) 

を利用できるfirst_partとsecond_partの両方を持っている mark_safeを使用すると、テンプレートにレンダリングされたHTMLとして表示されます。あなたがデータのソースを信用しないとセキュリティ上のリスクになる可能性があるので注意深く検討してください(GoodReadsはかなり安全な賭けですが、アプリケーションの防水度に応じて検討する価値があります)

<html> 
    <head> 
     {{ style_section|safe }} 
    </head> 
    <body> 
     {{ content_section|safe }} 
    </body> 
</html> 
+0

良いもの。ありがとうございました。明確にするために、simple_tagは必要ありません。私は、views.pyで変数を設定してテンプレートに送ることができます。 – limaBEAN

+0

Yepp!テンプレートタグを使用してデータをフォーマットする場合は、同様に行うことができます。しかし、テンプレート内で使用するのとまったく同じようにレスポンスHTMLを分割して表示する場合は、セーフフィルタをタックするだけで、期待どおりにレンダリングされます。 –

関連する問題