Use QR-Code in Django

Mbr Sagor
2 min readOct 19, 2021

--

Hello there, In this article, I will share how to generate or use Django QR-Code easily. I think you already set up the Django project in your local development server.

$ pip install pillow qrcode

First, install the package in your project then let’s go to the app's models.py file.

from django.db import modelsclass QRCode(models.Model):
name = models.CharField(max_length=100)
qr_image = models.ImageField(blank=True, null=True, upload_to='QRCode')

def __str__(self):
return self.name

Here, we created the QUCode`a model which has two fields name and qr_image field. That’s mean it is like a basic Django model nothing new. :-)

import qrcode
from io import BytesIO
from django.core.files import File
from PIL import Image, ImageDraw
def save(self, *args, **kwargs):
qr_image = qrcode.make(self.name)
qr_offset = Image.new('RGB', (310, 310), 'white')
draw_img = ImageDraw.Draw(qr_offset)
qr_offset.paste(qr_image)
file_name = f'{self.name}-{self.id}qr.png'
stream = BytesIO()
qr_offset.save(stream, 'PNG')
self.qr_image.save(file_name, File(stream), save=False)
qr_offset.close()
super().save(*args, **kwargs)

Now, at first, we create a save method into the QUCode model, and also the installed library/package imports some classes, methods, or something like this. Here, when the save method call automatically generates a QR code for your system. Basically, the above method is called to generate the QR-code.

admin.pyfile:

from .models import QRCode

Here is the full code:

import qrcode
from io import BytesIO
from django.core.files import File
from PIL import Image, ImageDraw
from django.db import models


class QRCode(models.Model):
name = models.CharField(max_length=100)
qr_image = models.ImageField(blank=True, null=True, upload_to='QRCode')

def __str__(self):
return self.name

# save method
def save(self, *args, **kwargs):
qr_image = qrcode.make(self.name)
qr_offset = Image.new('RGB', (310, 310), 'white')
draw_img = ImageDraw.Draw(qr_offset)
qr_offset.paste(qr_image)
file_name = f'{self.name}-{self.id}qr.png'
stream = BytesIO()
qr_offset.save(stream, 'PNG')
self.qr_image.save(file_name, File(stream), save=False)
qr_offset.close()
super().save(*args, **kwargs)

N:B: First only you have to save name not upload qr_imagethat’s mean qr_image the field will be saved as a blank field. Then when you again click the name field from the Django admin panel you will get the QRCode image.

--

--

Mbr Sagor

Hey There, I’m Bozlur Rosid Sagor from Gaibandha, Dhaka- Bangladesh. I’ve deep experience in Python, Django, REST API, ReactJs, and, Database.