2016-06-10 11 views
0

Ich möchte eine Reihe von pdfs herunterladen, die len(list_element) entsprechen. Ich erstelle PDF mit einer Liste (ich verwende 2 Elemente auf dieser Liste, um ein PDF zu "schreiben"), aber ich kann das erste pdf herunterladen, nicht andere. Danke für Ihre Hilfe.Django - Mehrere PDFTemplateResponse (wkhtmltopdf)

class CreatePDFCSVView(PDFTemplateView): 

"""View to create PDF.""" 
context = {} 

def get(self, request, *args, **kwargs): 
    """Create the PDF for the model.""" 
    self.context['object'] = get_object_or_404(LabelModel, pk=kwargs['pk']) 
    object_label = self.context['object'] or False 

    list_element_csv = [] 
    list_element = [] 
    with io.open("media/list_file", "r") as infile: 
     str_path = infile.read() 

    csvname = open(str_path, 'rb') 
    reader = csv.reader(codecs.iterdecode(csvname, 'utf-8'), delimiter=";") 
    for row in reader: 
     list_element_csv.append(row) 

    i=0 
    while i < len(list_element_csv): 
     if i==0: 
      header = list_element_csv[i] 
      i+=1 
     y=0 
     while y < len(list_element_csv[i]): 
      list_element.append(list_element_csv[i][y]) 
      y+=1 
     i+=1 

    imgdatabase = Image.objects.all() 

    while len(list_element) != 0 : 
     list_csv_pdf = [] 
     list_csv_pdf.append(list_element[0]) 
     list_csv_pdf.append(list_element[1]) 
     filename = 'model.pdf' 
     cmd_options = { 
      'page-height' : object_label.format_label.height, 
      'page-width' : object_label.format_label.width, 
      'margin-top' : object_label.format_label.margin_top, 
      'margin-left' : object_label.format_label.margin_left, 
      'margin-right' : object_label.format_label.margin_right, 
      'margin-bottom' : object_label.format_label.margin_bottom 
     } 

     if object_label: 
      filename = '%s_%s.pdf' %(object_label.labelModel_name, len(list_element)) 
      template_name = object_label.template_model.path 
      self.context['object'] = object_label 
      self.context['list_csv_pdf'] = list_csv_pdf 
      for queryset in imgdatabase: 
       str_img = "%s_%s" %('Image', queryset.name_img) 
       absolute_path = os.path.join(PATH_IMAGE_HTML, queryset.link_img.url) 
       self.context[str_img] = absolute_path 

     response = PDFTemplateResponse(
      request = request, 
      template = template_name, 
      filename = filename, 
      context = self.context, 
      show_content_in_browser = False, 
      cmd_options = cmd_options 
     ) 
     list_element.pop(0) 
     list_element.pop(0) 

     return response 

Antwort

0

In Ihrem letzten while-Schleife haben Sie eine return response. Dies wird bei der ersten Iteration passieren. Sie geben also nur eine PDF-Antwort zurück. Der Rest wird nie bearbeitet.

Sie können jedoch nicht mehrere Dokumente gleichzeitig in einer Antwort zurückgeben. Um das zu tun könnte man zB. Erstellen Sie eine Zip-Datei, die mehrere Dateien enthält.

Die While-Schleifen in Ihrem Code sollten durch kürzere, besser lesbare und weniger fehleranfällige Schleifen ersetzt werden.