如何通过Django中的自定义admin操作获取关联的模型? [英] How to get an associated model via a custom admin action in Django?
问题描述
+----+----------+---------------+-------------+
| id | title | data | template_id |
+----+----------+---------------+-------------+
| 1 | report 1 | {data: [...]} | 1 |
+----+----------+---------------+-------------+
reports table
+----+-----------+---------------+------------+
| id | title | markup | css |
+----+-----------+---------------+------------+
| 1 | template1 | <doctype!>... | body {.... |
+----+-----------+---------------+------------+
templates table
报告属于ReportTemplate.一个ReportTemplate有很多报告.
A Report belongs to a ReportTemplate. A ReportTemplate has many Report.
我在admin.py
中有一个针对报表的自定义管理操作,称为print_as_pdf
I have a custom admin action for Report in admin.py
called print_as_pdf
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):
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
字段值 - 通过1中的
markup
值输入报表的data
字段值,该值使用jinja2标记编写 - 使用weasyprint并将2中的数据填充标记打印为pdf
- retrieve the associated ReportTemplate and its
markup
field value - put the
data
field value of the Report through themarkup
value in 1 which is written with jinja2 markup - use weasyprint and print out the data-filled markup from 2 as pdf
我陷入了第一步.
给出参数self
,request
,queryset
,如何检索关联的ReportTemplate及其markup
字段值?
Given the parameters self
, request
, queryset
, how do I retrieve the associated ReportTemplate and its markup
field value?
更新1:
我试图以此来测试给出的答案之一.
I tried this to test one of the answers given.
import logging
logger = logging.getLogger(__name__)
# .... code here ...
def print_as_pdf(self, request, queryset):
for report in queryset:
markup = report.template.markup
logger.debug(markup)
return
更新2:
# Logging
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/virtual/WebApps/virtualenvs/WeasyPrintProject/weasyprint_site/debug.log',
},
},
'loggers': {
'reports.admin': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
在我的settings.py中写上
Wrote this in my settings.py
生成了debug.log
Generated a debug.log
但是,debug.log的内容为空
However, contents of debug.log are empty
更新3:
需要显式更改
logger = logging.getLogger(__name__)
到
logger = logging.getLogger('reports.admin')
推荐答案
只需获取Report
模型的template
字段:
def print_as_pdf(self, request, queryset):
for report in queryset:
markup = report.template.markup
...
print_as_pdf.short_description = 'Generate as pdf'
更新:要使用记录器您应该在源文件的开头添加以下两行:
UPDATE: To use the logger you should add these two lines at the beginning of the source file:
import logging
logger = logging.getLogger(__name__)
这篇关于如何通过Django中的自定义admin操作获取关联的模型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!