如果 jinja 标记是字符串格式,我如何在 django 和 jinja2 中使用它?
If jinja markup is in string format, how do I use it in django and jinja2?
这个问题是分开提问和回答的。
我有一个 Report
和一个 ReportTemplate
。
+----+----------+---------------+-------------+
| id | title | data | template_id |
+----+----------+---------------+-------------+
| 1 | report 1 | {data: [...]} | 1 |
+----+----------+---------------+-------------+
reports table
+----+-----------+---------------+------------+
| id | title | markup | css |
+----+-----------+---------------+------------+
| 1 | template1 | <doctype!>... | body {.... |
+----+-----------+---------------+------------+
templates table
报表属于报表模板。一个 ReportTemplate 有很多 Report。
我在 admin.py
中有一个名为 print_as_pdf
的自定义管理操作
import logging
logger = logging.getLogger('reports.admin')
from django.contrib import admin
# Register your models here.
from reports.models import Report, ReportTemplate
class ReportAdmin(admin.ModelAdmin):
fields = ['commodity',
'date',
'trade_period',
'quantity_cutoff',
'data',
'template',
'title']
actions = ['print_as_pdf']
def print_as_pdf(self, request, queryset):
logger.debug('anything')
for report in queryset:
markup = report.template.markup
logger.debug(markup)
return
print_as_pdf.short_description = 'Generate as pdf'
这些是模型:
class ReportTemplate(models.Model):
title = models.CharField(max_length=50)
markup = models.TextField(default = 'markup here...')
styles = models.TextField(default = 'styles here...')
# __unicode__ on Python 2
# __str__ on Python 3
def __unicode__(self):
return self.title
class Report(models.Model):
title = models.CharField(max_length=50)
commodity = models.CharField(max_length=10)
date = models.DateTimeField('date traded')
trade_period = models.CharField(max_length=10, default='open')
quantity_cutoff = models.IntegerField(default=0)
printed = models.BooleanField(default=0)
datetime_email_sent = models.DateTimeField('date email sent', blank=True, null=True)
data = models.TextField(default = 'data here...')
template = models.ForeignKey(ReportTemplate)
我想做的是:
- 检索关联的 ReportTemplate 及其
markup
字段值
- 将Report的
data
字段值通过jinja2 markup写的markup
值markup
- 使用 weasyprint 并将 2 中的数据填充标记打印为 pdf
我卡在第 2 步了。
由于我检索到的标记是字符串格式,我如何 运行 它与我拥有的数据一起完成?
从Jinja 2 documentation开始调整,可以像
一样简单
>>> template = Template(report.markup)
>>> template.render(report=report)
<html>...
如果要将输出存储到另一个变量中
>>> final_markup = template.render(report=report)
前提是您的模板希望将整个报告作为 report
模板参数。
我有一个 Report
和一个 ReportTemplate
。
+----+----------+---------------+-------------+
| id | title | data | template_id |
+----+----------+---------------+-------------+
| 1 | report 1 | {data: [...]} | 1 |
+----+----------+---------------+-------------+
reports table
+----+-----------+---------------+------------+
| id | title | markup | css |
+----+-----------+---------------+------------+
| 1 | template1 | <doctype!>... | body {.... |
+----+-----------+---------------+------------+
templates table
报表属于报表模板。一个 ReportTemplate 有很多 Report。
我在 admin.py
中有一个名为 print_as_pdf
import logging
logger = logging.getLogger('reports.admin')
from django.contrib import admin
# Register your models here.
from reports.models import Report, ReportTemplate
class ReportAdmin(admin.ModelAdmin):
fields = ['commodity',
'date',
'trade_period',
'quantity_cutoff',
'data',
'template',
'title']
actions = ['print_as_pdf']
def print_as_pdf(self, request, queryset):
logger.debug('anything')
for report in queryset:
markup = report.template.markup
logger.debug(markup)
return
print_as_pdf.short_description = 'Generate as pdf'
这些是模型:
class ReportTemplate(models.Model):
title = models.CharField(max_length=50)
markup = models.TextField(default = 'markup here...')
styles = models.TextField(default = 'styles here...')
# __unicode__ on Python 2
# __str__ on Python 3
def __unicode__(self):
return self.title
class Report(models.Model):
title = models.CharField(max_length=50)
commodity = models.CharField(max_length=10)
date = models.DateTimeField('date traded')
trade_period = models.CharField(max_length=10, default='open')
quantity_cutoff = models.IntegerField(default=0)
printed = models.BooleanField(default=0)
datetime_email_sent = models.DateTimeField('date email sent', blank=True, null=True)
data = models.TextField(default = 'data here...')
template = models.ForeignKey(ReportTemplate)
我想做的是:
- 检索关联的 ReportTemplate 及其
markup
字段值 - 将Report的
data
字段值通过jinja2 markup写的markup
值markup
- 使用 weasyprint 并将 2 中的数据填充标记打印为 pdf
我卡在第 2 步了。
由于我检索到的标记是字符串格式,我如何 运行 它与我拥有的数据一起完成?
从Jinja 2 documentation开始调整,可以像
一样简单>>> template = Template(report.markup)
>>> template.render(report=report)
<html>...
如果要将输出存储到另一个变量中
>>> final_markup = template.render(report=report)
前提是您的模板希望将整个报告作为 report
模板参数。