如何用模型中的值填充PDF

时间:2019-05-14 00:54:25

标签: python django pdf

我的django项目以PDF文件的形式生成一个视图,该视图使用HTML文件来概述格式。我有一个单独的视图,该视图仅显示“订单”模型中所有“参考ID”的下拉列表。我的目标是从下拉列表中选择一个“引用ID”,单击“提交”,然后让PDF生成某些值,这些值中包含与订单模型中与该引用ID相对应的数据中的值。

例如,我想

下面列出了我所拥有的-对于此问题的任何帮助将不胜感激!

以下显示了用于生成下拉菜单的视图的代码:

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,从中创建下拉菜单参考ID,我想将其他字段拉入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

如您所见-我目前正在对View值进行硬编码,然后将其显示在PDF上-但我希望这些值能够从Orders模型中提取。

即例如WHERE参考ID = 100,最终收货人= John Smith

1 个答案:

答案 0 :(得分:0)

您必须通过一些更改来改进代码

第一

您的表单没有指向任何操作(也许您正在使用Js激活生成PDF的视图),并且将表单数据传递到视图的最简单方法是使表单action属性指向目标视图。

假设您的视图有一个名为 generate_pdf 的URL(请参见Naming URL patterns),那么您可以在模板中输入

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

祝你好运!

注意:我还没有测试过,这只是向您展示一种可以用来实现所需目标的方法。