繁体   English   中英

模板视图中的Django调用脚本

[英]Django call script in view from template

我有一个视图,显示某个项目从一个日期到另一个日期的条目。 该项目模型称为“ DNN”,其上的时间在“ Vnos”模型中。

views.py:

def po_nalogu(request, dnn = None):
dnn = None

form = PregledDNNForm(
    request.GET or None,
)
from_date = get_month_start(timezone.now())
to_date = from_date + relativedelta(months=1)
if request.GET:
    if form.is_valid():
        from_date, to_date, dnn = form.save()
entries_qs = Vnos.objects.filter(dna__dns__dnn = dnn)

month_entries = entries_qs.timespan(from_date, to_date=to_date).order_by('start_time')
sestevek = 0
for entry in month_entries:
    sestevek = sestevek + entry.hours

template = 'porocila/po_nalogu.html'
context = {
    'form' : form,
    'from_date': from_date,
    'to_date': to_date - relativedelta(days=1),
    'entries': month_entries,
    'sestevek' : sestevek,
}

return render(request, template, context=context)

现在,我想添加一个条件句,以便可以打印PDF。 是否可以添加类似以下内容的方法:

if request.method == "PDF"
    do code

并在模板中:

<form action="" method="PDF">
    <input type="submit" />
</form>

由于开始日期和结束日期,我不想为PDF文件做一个单独的视图,因为它需要大量的计算时间。 谢谢

嗯,如果要发送自定义参数,可以执行以下操作:

<form method="GET" action="/path/to/action/?pdf">

然后在视图中,您只需检查:

request.GET.get('pdf', '')

我用POST方法解决了麻烦,因为GET方法从模板中的previus形式覆盖了我的论点。 上一个参数是from_date和to_date。 这意味着带有action =“?pdf”的GET方法会将其他所有内容设置为空白,并添加“?pdf”。

但是,这很完美。

模板:

<form method="POST" action="" class="pull-right">
{% csrf_token %}
    <button type="submit"> PDF</button>
</form>

views.py:

if request.POST:
    context = {
        'request' : request,,
        'from_date': from_date,
        'to_date': to_date - relativedelta(days=1),
    }
    html_string = render_to_string("pdf.html", context)
    html = HTML(string = html_string)
    pdf = html.write_pdf()
    response = HttpResponse(pdf, content_type = 'application/pdf')
    response['Content-Disposition'] = 'attachment; filename="FILENAME.pdf"
    return response

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM