Search code examples
pythondjangoweasyprint

How to load static images in a django template from function not from view


I am using a django template to generate pdf via feeding it a context object from the function but not the view, it works fine in case of view, but I am not able to load the local static images on the template from the function. but this is possible in view because there I can tell which base path to use. But I not able to do the same in the function.

As you can see I can how I am getting the base url from the view. Here I can get because I have requests object but in function I do not have any requests object. So images are not loading.

    html = HTML(string=html_string, base_url=request.build_absolute_uri('/'))

This is how I am trying to do in the function:

    html_string = render_to_string('experiences/voucher.html', data)
    html = HTML(string=html_string, base_url=settings.STATIC_ROOT)
    result = html.write_pdf("file_new.pdf", stylesheets=[css],optimize_images=True)

I would like to know how can I tell, where are my images so that images can be rendered on the pdf.


Solution

  • It was not working because base_url had not way to know where the images are located especially on the running server, so I had to explicitly define the path to the local resources so I did something like this: first I added an envoirnment variable in my .env file:

    like HOST=http://localhost:8000 and then I get this url in my actuall code like this:

    path = os.environ["HOST"]+"/static/"
    

    and at the end i pass this path to base_url parameter in HTML()

    html = HTML(string=html_string, base_url=path)
    

    and after all this it worked like a charm.