To make this application perform better in the real world, there are a lot of things that need to be done. You need to add testing, you need to test the model, the views, the templates, and, finally, you need to carry out solid integration tests. You also need to put heavy and long operations (such as calling operations on the smart contract, adding and getting files with IPFS) in the background jobs using Celery and RabbitMQ or Redis. In addition to this, you need to add some JavaScript files in order to notice whether the background jobs have finished or not using a pooling mechanism. You could also use the Django channel to do the job.
Instead of accessing methods of the smart contract in the model, perhaps it is better to put all information from the blockchain in the database in the background task using cron. Then the model can access the database to get necessary information...