我的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
答案 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')
祝你好运!
注意:我还没有测试过,这只是向您展示一种可以用来实现所需目标的方法。