2012-05-04 2 views
1

이것은 내 코드 스 니펫입니다. render_to_response가 제대로 작동하지 않는 이유

soup=BeautifulSoup(html_document) 
tabulka=soup.find("table",width="100%") 
dls=tabulka.findAll("dl",{"class":"resultClassify"}) 
tps=tabulka.findAll("div",{"class":"pageT clearfix"}) 
return render_to_response('result.html',{'search_key':search_key,'turnpages 
':tps,'bookmarks':dls}) 

나는 그것은 딕셔너리가
<dl>label contents contains some <dd> labels</dl> 

그러나 패스 DLS는 결과에는 render_to_response하는 후

가 올바르지 않은 하나 개의 HTML 레이블이 포함되면, DLS를 확인했습니다. result.html에서 대응하는 템플릿 코드 :

{% if bookmarks %} 
{% for bookmark in bookmarks %} 
{{bookmark|safe}} 
{% endfor %} 
{% else %} 
<p>No bookmarks found.</p> 
{% endif %} 

출력 결과 HTML 이런 파이썬 사전 포맷을 포함

[<dd>some html</dd>,<dd>some html</dd>,<dd>some html</dd>,...] 

이 출력 HTML에서 나타난다. 그것은 매우 이상합니다. 이것은 renfer_to_response의 버그입니까?

답변

2

글쎄, dls은 일치하는 모든 요소의 텍스트를 포함하는 파이썬 목록입니다. render_to_response은 목록을 어떻게 처리해야할지 모르기 때문에 문자열로 바꿔줍니다. 당신이 HTML 등의 모든 요소를 ​​삽입 할 경우,과 같이 텍스트의 한 조각으로 그들을 결합하십시오 :

DLS의 = ""그렇게함으로써 라이브 HTML을 붙여 넣는 것을 .join (DLS)

주 다른 소스에서 자신의 페이지로 옮길 수 있습니다. 이는 잠재적으로 안전하지 않습니다. (dds 중 하나에 악의적 인 자바 스크립트가있는 경우 어떻게됩니까? 해당 HTML 공급자를 신뢰할 수 있습니까?)

+0

보안 측면을 언급하기 위해 +1 – heinrich5991

1

장고에서 템플릿을 렌더링 할 때 RequestContext 인스턴스를 사용해야합니다. 이 사용할 수 있도록

는 다음과 같이 가져와야이

return render_to_response('login.html',{'at':at}, context_instance = RequestContext(request)) 

같은 말 :

from django.template import RequestContext 

희망이 당신을 위해 작동합니다. :)

+0

RequestContext와 함께 render_to_response를 사용하는 대신 [render] (https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django)를 가져와야합니다. shortcuts.render)를 사용하고'return render (request, 'result.html', { 'search_key': search_key, 'turnpages ': tps, 'bookmarks': dls})'를 사용하십시오. 렌더링은 render_to_response이지만 RequestContext를 사용합니다. – olofom