如何通过Django中的自定义admin操作获取关联的模型? [英] How to get an associated model via a custom admin action in Django?

查看:143
本文介绍了如何通过Django中的自定义admin操作获取关联的模型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ReportReportTemplate.

+----+----------+---------------+-------------+
| 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)

我想做的是:

  1. 获取关联的ReportTemplate及其markup字段值
  2. 通过1中的markup值输入报表的data字段值,该值使用jinja2标记编写
  3. 使用weasyprint并将2中的数据填充标记打印为pdf
  1. retrieve the associated ReportTemplate and its markup field value
  2. put the data field value of the Report through the markup value in 1 which is written with jinja2 markup
  3. use weasyprint and print out the data-filled markup from 2 as pdf

我陷入了第一步.

给出参数selfrequestqueryset,如何检索关联的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆