【问题标题】:Django-wkhtmltopdf - dynamic templatesDjango-wkhtmltopdf - 动态模板
【发布时间】:2021-01-12 16:19:53
【问题描述】:

我想知道是否可以使用表单根据提供给基于类的视图的数据动态分配template_name

例如我有以下表单页面:

views.py

def form_generate_pdf(request, project_id):
   """Form to collect data to insert into PDF"""

   project = Project.objects.get(id=project_id)

   if request.method == 'POST':
      form = PDFForm(request.POST)
      if form.is_valid():
         request.session['field1'] = form.cleaned_data.get('field1')
         return redirect('myapp:generate_pdf')

   else:
      form = PDFForm()

   context = {
      'project': project,
      'form': form
   }

以及生成 PDF 的页面:

views.py

class Generate_PDF(PDFTemplateView):
   """Generate a PDF using the values from form_generate_pdf"""

   filename = "test.pdf"
   # I want the field below to be dynamic depending on the value of field1 from the view form_generate_pdf
   template_name = "myapp/pdf.html"
   cmd_options = {
      'page-size': 'Letter',
      'viewport-size' : '1920x1080',
      'footer-left' : '[page]/[topage]',
      'no-outline' : True,
   }

   def get_context_data(self, **kwargs):
      context = super(Generate_PDF, self).get_context_data(**kwargs)
      field1 = self.request.session['field1']
      context['field1'] = field1
      }

我会说我是 django 的中级,但总的来说我对 python 和 django 还是很陌生(现在玩了大约 5 个月),我似乎没有足够的理解来弄清楚如何插入一些逻辑到Generate_PDF 类以编程方式选择模板类型。比如:

if field1 == 'this':
   template_name = 'myapp/pdf_1.html'
else:
   template_name = 'myapp/pdf_2.html'

问题是我的视图似乎看不到 field1 变量。

也许我也以错误的方式解决了这个问题。我可以让我的表单重定向到我想的独特的基于类的视图,但即使这样可以解决我的问题,它对我来说感觉非常重复和不正确。

【问题讨论】:

    标签: python django wkhtmltopdf django-class-based-views


    【解决方案1】:

    在查看了更多示例、文档(不幸的是,django-wkhtmltopdf 模块很稀疏)以及该模块的 github 存储库之后;我想出了如何覆盖get_filenameget_template_name 函数。

    class Generate_PDF(PDFTemplateView):
       """Generate a PDF using the values from form_generate_pdf"""
    
       # filename = "test.pdf"
       # I want the field below to be dynamic depending on the value of field1 from the view form_generate_pdf
       # template_name = "myapp/pdf.html"
       cmd_options = {
          'page-size': 'Letter',
          'viewport-size' : '1920x1080',
          'footer-left' : '[page]/[topage]',
          'no-outline' : True,
       }
    
       # I found this looking at the github repository
       def get_filename(self):
         if self.field1 == 'foo':
           filename = 'bar1.pdf'
         else:
           filename = 'bar2.pdf'
         return filename
    
       # I found this looking at the Django documentation
       def get_template_names(self):
         if self.field1 == 'foo':
           template_name= 'myapp/bar1.html'
         else:
           template_name= 'myapp/bar2.html'
         return template_name
    
       def get_context_data(self, **kwargs):
          context = super(Generate_PDF, self).get_context_data(**kwargs)
          self.field1 = self.request.session['field1']
          context['field1'] = field1
          }
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2016-05-13
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多