2016-10-06 15 views
1

私はDjangoアプリケーションでWeasyprint経由でHTMLをPDFにエクスポートしています。私は、テンプレートのhtmlをフロントエンドに送ってそのHTMLをバックエンドに戻してpdfにエクスポートすると、それが完全に印刷されることに気付きました。しかし、私がWeasyprintにテンプレートhtmlを直接送信すると、すべてがうんざりになります!いいえCSS、JavaScriptはありません。DjangoテンプレートでJavascriptとCSSを実行

これは私がHTMLを生成するためにテンプレートを使用している方法です:

私のJSコントローラで
template = loader.get_template('Reporting/reportTemplate.html') 
context = { 
    "reportObj" : result[0] 
}  

htmlContent = (template.render(context, request)) 
response['message'] = htmlContent 
return JsonResponse(response) 

私は私のdivにhtmlContentを割り当てる:

$('#htmlContent').html(response.message); 

その後、私は戻って生成されたHTMLを返します私のDjango関数でpdfを印刷する

HTML(string=htmlContent).write_pdf(target=response, stylesheets=[CSS(string=getCSS())]) 

このようにして、デザインとすべてを維持します。

しかし、htmlContentをフロントエンドに送信せずにWeayprintに直接送信すると、デザインと色付けが消えてしまいました。私のテンプレートで

は、私もこのようなCSSやJavaScriptファイルが含まれている:

私は、フロントエンドに送信することなく、DjangoのテンプレートやPDFへのエクスポートにJavascriptとCSSを実行するにはどうすればよい
{% load static %} 
{% block content %} 
<link href="{% static "css/ion.rangeSlider.css" %}" rel="stylesheet"> 
<link href="{% static "css/ion.rangeSlider.skinHTML5.css" %}" rel="stylesheet"> 
<script type='text/javascript' src='{% static "scripts/ion.rangeSlider.js" %}'></script> 

<script type='text/javascript'> 
$(document).ready(function(){ 
    var creditScore = $("#creditScore").html(); 

    $("#rangeCS").ionRangeSlider({ 
     type: "double", 
     min: 0, 
     max: 1000, 
     step: 100, 
     from: 0, 
     to: creditScore, 
     from_fixed: true, 
     to_fixed: true, 
     grid: true, 
     grid_snap: true 
    }); 
}); 
</script> 

{% endblock %} 

+1

おそらく、ページを内部的にレンダリングしようとすることができます。いくつかの詳細:http://stackoverflow.com/questions/126131/python-library-for-rendering-html-and-javascript#126250 – Marcs

+0

私はそれを考慮して –

答えて

0

WeasyprintのソースとしてレンダリングするテンプレートにJSがあることを意味していますか? JSはクライアント側(ブラウザなど)でのみ実行されるため、Weasyprintはそれを実行しないため、実行できません。 Weasyprintに最終的な文書(HTML)を提供する必要があります。

あなたのPDFにCSSの問題がある場合は、サポートされていないCSS機能をWeasyprintに使用している可能性があります。

+0

私は特定の種類を表示するために私のテンプレートでrangeSliderを使用していますデータ。ブラウザに送信することなく、JavaScriptをweasyprintに送信する前にJavascriptを実行する方法はありますか? –

+0

あなたのdjangoアプリケーションが実行されている場所でjavascriptエンジンを実行する方法が必要だと思います。 http://jeanphix.me/Ghost.py/やSelenium + Phantom webdriverのようなものを使ってサイトを実行し、コンテンツを生成することができます – Willemoes

0

mille_aのように、あなたはpdfにjavascriptコードを実行することはできません。

は、だからあなたの問題を解決するために、あなたのビューにそれを実行する必要があります。

# do some python stuff to get somes datas 
datas = ... 

# assign it into your html 
htmlContent = my_html_template.render(datas) 

# call the pdf generation 
HTML(string=htmlContent).write_pdf(target=response) 

あなたが詳細については、この例を見ることができます:http://www.supinfo.com/articles/single/379-generate-pdf-files-out-of-html-templates-with-django

はそれがお役に立てば幸いです。

関連する問題