Как заполнить PDF значениями из модели - PullRequest
0 голосов
/ 14 мая 2019

Мой проект django генерирует представление в форме файла PDF, который использует файл HTML, чтобы очертить формат.У меня есть отдельное представление, которое просто отображает раскрывающийся список всех «идентификаторов ссылок» в моей модели «Заказы».Моя цель состоит в том, чтобы выбрать «Идентификатор ссылки» из выпадающего списка, нажать «Отправить» и заставить PDF-файл сгенерировать определенные значения со значениями из данных, соответствующих этому ссылочному идентификатору в модели «Заказы».

Например, я бы хотел

То, что у меня есть, перечислено ниже - любая помощь в решении этой проблемы будет принята с благодарностью!

Ниже приведен код для генерации представленияраскрывающийся список:

VIEWS.PY

def reference_view(request):
    query_results = Orders.objects.all()
    reference_list = DropDownMenuReferences()

    context = {
        'query_results': query_results,
        'reference_list': reference_list
    }
    return render(request, 'proforma_select.html', context)

FORMS.PY

class DropDownMenuReferences(forms.Form):
    Reference_IDs = forms.ModelChoiceField(queryset=Orders.objects.values_list('reference', flat=True).distinct(),
    empty_label=None)

Proforma_select.html

{% extends 'base.html' %}

{% block body %}

<div class="container">

  <br>

  <form method=POST action="">
    {{ reference_list }}

    <button type="submit" class="btn btn-primary" name="button">Add Order</button>
  </form>

</div>

{% endblock %}

Ниже показан код дляPDF, который генерируется:

VIEWS.PY

def generate_view(request, *args, **kwargs):
    template = get_template('invoice.html')
    context = {
        "invoice_id": 123,
        "ultimate_consignee": "john cooper",

    }
    html = template.render(context)
    pdf = render_to_pdf('invoice.html', context)
    return HttpResponse(pdf, content_type='application/pdf')

INVOICE.HTML (единственный способ найти это в Интернете - HTML 4)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Proforma Invoice</title>
        <style type="text/css">
            body {
                font-weight: 200;
                font-size: 14px;
            }
            .header {
                font-size: 20px;
                font-weight: 100;
                text-align: center;
                color: #007cae;
            }
            .title {
                font-size: 22px;
                font-weight: 100;
               /* text-align: right;*/
               padding: 10px 20px 0px 20px;
            }
            .title span {
                color: #007cae;
            }
            .details {
                padding: 10px 20px 0px 20px;
                text-align: left !important;
                /*margin-left: 40%;*/
            }
            .hrItem {
                border: none;
                height: 1px;
                /* Set the hr color */
                color: #333; /* old IE */
                background-color: #fff; /* Modern Browsers */
            }
            .column {
              float: left;
              width: 50%;
            }
        </style>
    </head>
    <body>
            <div class='header'>
                <p class='title'>Proforma Invoice # {{ invoice_id }}</p>
                <p class='title'>Customer: {{ ultimate_consignee }}</p>
            </div>

    </body>
</html>

Ниже приведена модель MODELS.PY для заказов, из которой созданы идентификаторы ссылок в раскрывающемся меню, и где я хотел бы перетащить другие поля в PDF:

MODELS.PY

class Orders(models.Model):

    reference = models.CharField(max_length=50, blank=False)
    ultimate_consignee = models.CharField(max_length=500)
    ship_to = models.CharField(max_length=500)
    vessel = models.CharField(max_length=100)
    booking_no = models.CharField(max_length=50, blank=True)
    POL = models.CharField(max_length=50)
    DOL = models.DateField()
    COO = models.CharField(max_length=50)
    POE = models.CharField(max_length=50)
    ETA = models.DateField()
    pickup_no = models.CharField(max_length=50)
    terms = models.CharField(max_length=1000)
    sales_contact = models.CharField(max_length=100)
    trucking_co = models.CharField(max_length=100)
    loading_loc = models.CharField(max_length=100)
    inspector = models.CharField(max_length=50)
    total_cases = models.IntegerField()
    total_fob = models.DecimalField(max_digits=10, decimal_places=2)
    freight_forwarder = models.CharField(max_length=100)
    commodity = models.CharField(max_length=200)
    is_airshipment = models.BooleanField(default=False)
    credit = models.DecimalField(max_digits=10, decimal_places=2)

def _str_(self):
    return self.reference

AsВы можете видеть - я в настоящее время жестко кодирую значения в представлении, которые затем появляются в PDF - но я бы хотел, чтобы они извлекались из модели заказов.

то есть что-то вроде WHERE Reference ID = 100, Ultimate Consignee= Джон Смит

1 Ответ

0 голосов
/ 14 мая 2019

Вы должны улучшить свой код с парой изменений

Первый

Ваша форма не указывает на какое-либо действие (возможно, вы используете Js для активации представления, которое генерирует PDF), и самый простой способ доставки данных формы в представление - это сделать атрибут формы action, указывающий на цель вид.

Допустим, у вашего представления есть URL с именем generate_pdf (см. Именование шаблонов URL ), тогда вы можете использовать его в своем шаблоне:

 <form method=POST action="{% url generate_pdf %}">
    {{ reference_list }}
    <button type="submit" class="btn btn-primary" name="button">Add Order</button>
 </form>

Второй

... имея форму, указывающую на ваше представление, вы можете прочитать Reference_IDs из данных поста, чтобы получить экземпляр Order и использовать его:

def generate_view(request, *args, **kwargs):

    context = {}

    if request.method == 'POST':
        order_reference = self.request.POST.get('Reference_IDs')
        if order_reference is not None:
            order = Orders.objects.get(reference=order_reference)
            template = get_template('invoice.html')
            context.update({
                "ultimate_consignee": order.ultimate_consignee,
                # ... 
            })
            html = template.render(context)
    pdf = render_to_pdf('invoice.html', context)
    return HttpResponse(pdf, content_type='application/pdf')

Удачи!

Примечание: я не проверял это, это просто попытка показать вам один из подходов, которым вы можете следовать, чтобы достичь того, чего вы хотите.

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