Джанго рендер в PDF с внешним ключом - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу отобразить в PDF nome из pavimento на AvariaAdmin, и я действительно не знаю, как это сделать.

http://prntscr.com/mmm5eo

МОИ модели

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")
class Pavimento(models.Model):

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

МОЙ ДЕФ (ВНУТРИ AvariaAdmin)

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

МОЙ HTML

        <table style="width:100%">
                <tr>
                    <th>ID:</th>
                    <th>Freguesia:</th>
                    <th>Rua:</th>  
                    <th>Porta:</th>
                    <th>Tipo avaria:</th>
                    <th>Pavimento:</th>
                 </tr>
                 {% for item in obj %}
                    <tr> 
                        <td>{{item.id}}</td>   
                        <td>{{item.freguesia }}</td>
                        <td>{{item.rua}}</td> 
                        <td>{{item.porta}} </td>
                        <td>{{item.tipo_avaria}} </td>
                        <td>{{item.pavimento}} </td>
                    </tr>
                {% endfor %}    

        </table>

1 Ответ

0 голосов
/ 18 февраля 2019

Во-первых, класс Pavimentacao не нужен, если это все, что в нем содержится (но, возможно, вы не показали нам всю модель).Он просто поддерживает отношение «многие ко многим» между Avaria и Pavimento, которое вы должны смоделировать напрямую с помощью 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 для обратной связи, поэтому это должно быть название модели, которую вы определяете, а не той, на которую вы ссылаетесь.Прочитайте документы , чтобы понять обратные отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...