Home > Net >  create pdf with each post django
create pdf with each post django

Time:01-11

Currently working on a django social media application where next to posting every post to the feed, the information of each upload should create a pdf document, containing caption, image, created_at and image_id.

I´ve put the canvas into the upload functions, so that both will be created on the same click. So far, i get a pdf (can't get the attributes from the post into the pdf tho) and the post is uploaded just fine. How do I get the posted data into the pdf? And how do save that pdf to a folder within the project instead of starting an automatic download? The user should not be able to notice the pdf converting. It is just for back office - but very necessary due to the social media website being a part of a big installation. So how do I get these pdfs?

Here is the code:

views.py

def upload(request):
    if request.method == 'POST':
        #user = request.user.username
        image = request.FILES.get('image_upload')
        caption = request.POST['caption']

        new_post = Post.objects.create( image=image, caption=caption)
        new_post.save()

        #create pdf
        buffer = io.BytesIO()
        p = canvas.Canvas(buffer)


        p.drawString(100, 100, "Hello world.")
        p = request.FILES.get('post_pdf')
        p.drawText('caption')
        p.drawImage('image')
        p.showPage()
        p.save()
        buffer.seek(0)
        return FileResponse(buffer, as_attachment=True, filename='hello.pdf')


        return redirect('/')


    else:
        return redirect('/')


models.py

class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)

    image = models.ImageField(upload_to='post_images')
    caption = models.TextField(max_length=300)
    created_at = models.DateTimeField(auto_now_add=True)
    number_of_likes = models.IntegerField(default=0)
    number_of_dislikes = models.IntegerField(default=0)
    #interaction_count = models.IntegerField(default=0)

    #engagement_count = models.IntegerField(null=True)#number_of_dislikes   number_of_likes

    def __str__(self):
        return self.caption

CodePudding user response:

To add the value of Post.caption into the pdf, use the value of new_post.caption, change this:

p.drawText('caption')

for this:

p.drawText(new_post.caption)

Same for other fields.

CodePudding user response:

This is not as hard as it seems, so Let's see if you are successful in creating a pdf and now you have to store it in background instead of downloading.

file_name = request.FILES["file_name"]. #suppose wblist is file name
file_name = default_storage.save(rf"{basePath}/media/whatsapp/file_name.pdf", file_name) #{basePath}/media/whatsapp/ is the path name where we want it to be stored
  • Related