Often it's necessary to import modules used in your code and often you see them imported as below:
from projects.models import Project
from django.views.generic import *
class ProjectListView(ListView):
= Project
model = 'projects.html' template_name
Why is it a problem?
Two issues are evident above. Firstly the model Project
is absolutely imported by hardcoding the app name. If this is done in multiple places, and then for some reason the app name projects
changed in the future, all these imports would fail. Secondly, you are importing everything from django.views.generic
using *
which accesses everything in there including what you do not need. This also means that, you are loading, into memory, modules you may not be using at all. And what if something changes in the future?
What can be done to resolve the problem?
PEP20 says explicit is better than implicit
so for local imports, be as explicit as possible and use absolute imports when necessary.
The code above can be re-written thus:
from django.views.generic import ListView
from .models import Project
class ProjectListView(ListView):
= Project
model = 'projects.html' template_name
Extra tips
Pep8
maintains that imports be placed at the top of the file you are working on and should be grouped together in the order below: - Standard libary imports - Third party library imports - Local/App level imports You don't need to do this manually if you don't want to. isort is a handy library that can sort the imports in your file.