Я столкнулся с действительно сложной проблемой, поднятой здесь
Чтобы подвести итог, я пытаюсь разрешить пользователям выбирать несколько экземпляров модели и использовать xhtml2pdf для визуализации только выбранная модель динамически. Чтобы сделать это, я использую javascript, чтобы отслеживать экземпляры, которые были нажаты пользователем, и сохранять их в массив. Когда пользователь нажал fini sh, он щелкнул бы по кнопке генерирования, которая возьмет массив и отправит его через запрос AJAX POST на мой взгляд, который отобразит pdf.
Вот некоторые из мой код:
мои взгляды
def BomPdf(request):
if request.is_ajax():
listy = request.POST.getlist('arr[]')
trials = FormulationTrial.objects.filter(pk__in = listy)
print(trials)
print(listy)
pk = request.POST.get('pk')
data = {
'product' : ProductFormulation.objects.filter(formulation_id = pk)[0],
'trials' : FormulationTrial.objects.filter(pk__in = listy),
'item' : TrialItems.objects.filter(formulationTrial__productFormulation__formulation_id__contains = pk),
'itemdetails' : ItemDetails.objects.filter(itemdetail_id__in = TrialItems.objects.filter(formulationTrial__productFormulation__formulation_id__contains = pk).values_list('itemdetail', flat=True).distinct().order_by()),
}
pdf = render_to_pdf('rnd/bom_pdf.html', data)
return HttpResponse(pdf , content_type='application/pdf')
else:
return JsonResponse({'status':'Fail', 'is_read':'not changed'})
мой javascript
function ajaxsender(clicked_id){
var b = clicked_id
$.ajax({
url : "{% url 'bom-pdf'%}",
method : "POST",
async: false,
data : {
'csrfmiddlewaretoken' : "{{ csrf_token }}",
'arr[]' : arr ,
'pk' : b },
success : function(result) {
console.log(arr)
console.log(result)
window.location.href = "{%url 'bom-pdf'%}";
}
})};
и мой html
{% for product in product %}
<div id = {{product.formulation_id}} onClick="return ajaxsender(this.id);" class='btn w3-teal float-right' style="margin-right:3%">Generate BOM PDF</div>
{% endfor %}
, как вы можете см. в моей командной строке после нажатия кнопки «Создать PDF» один раз:
<QuerySet [<FormulationTrial: 10>, <FormulationTrial: 11>, <FormulationTrial: 12>, <FormulationTrial: 13>, <FormulationTrial: 14>]>
['10', '11', '12', '13', '14']
HTTP POST /project/rnd/bom/pdf/ 200 [0.37, 127.0.0.1:61834]
HTTP GET /project/rnd/bom/pdf/ 200 [0.01, 127.0.0.1:61834]
Похоже, что отправляется несколько запросов, что приводит к их пропуску в оператор else.
Я пытался удалить операторы if и else, но из-за нескольких отправляемых запросов он выдал ошибку, сообщив, что pk не является, поэтому мой вопрос в том, есть ли способ сделать перенаправление в одном запросе? если это невозможно, есть ли альтернативное решение для достижения моей цели?