Django使用外键渲染为PDF

时间:2019-02-18 12:09:53

标签: django pdf django-admin

我想将nomepavimento的{​​{1}}的PDF渲染为PDF,我真的不知道该怎么做。

http://prntscr.com/mmm5eo

我的模型

AvariaAdmin
class Avaria(models.Model):

    freguesia = models.ForeignKey(Freguesia, on_delete=models.CASCADE,verbose_name="Freguesia")
    rua = models.ForeignKey(Rua, on_delete=models.CASCADE,verbose_name="Rua")
    porta = models.PositiveIntegerField(verbose_name="Numero de polícia")
    tipo_avaria = models.ForeignKey(Tipo_avaria, on_delete=models.CASCADE,verbose_name="Tipos de avaria")
class Pavimentacao(models.Model):

    avaria = models.ForeignKey(Avaria, related_name='AvariaObjects',on_delete=models.CASCADE)
    pavimento = models.ForeignKey(Pavimento, on_delete=models.CASCADE, verbose_name="Pavimento")

我的DEF(在AvariaAdmin内部)

class Pavimento(models.Model):

    nome = models.CharField("Pavimento",max_length=200)

我的HTML

def Imprimir(self, request, obj):
    data = {
            'obj':obj
    }
    pdf = render_to_pdf('daa/imprimir/avarias_pdf.html', data)
    if pdf :
        response = HttpResponse(pdf, content_type='application/pdf')
        filename ="Avaria_%s.pdf" %("123451231")
        content = "inline; filename='%s'" %(filename)
        response['Content-Disposition'] = content
        download = request.GET.get("download")
        if download:
                content = "attachment; filename='%s'" %(filename)
        response['Content-Disposition'] = content
        return  response
    return HttpResponse("Not found")

1 个答案:

答案 0 :(得分:1)

首先,如果类Pavimentacao仅包含其中的所有类,则无需这样做(但也许您没有向我们展示所有模型)。它只是在AvariaPavimento之间保持多对多关系,您应该直接使用models.ManyToManyField进行建模:

class Avaria(Model):
    ...
    pavimentos = models.ManyToManyField(Pavimento)

然后,如果要打印所有Pavimento实例,则在模板中:

<tr>
    ...
    <td>
        {% for pavimento in item.pavimentos.all %}
            {{ pavimento.nome }}<br>
        {% endfor %}
    </td>
</tr>

但是,如果您保持模型不变,则模板代码将为:

<tr>
    ...
    <td>
        {% for pavimentacao in item.AvariaObjects.all %}  <!-- this is because of the related_name you defined -->
            {{ pavimentacao.pavimento.nome }}<br>
        {% endfor %}
    </td>
</tr>

看看您给的related_name是怎么错的? related_name用于反向关系,因此它应该是您正在定义的模型的名称,而不是您所引用的模型。阅读docs了解反向关系。