Fetching and displaying the provisioning status of a phone number
You may want to use a different template for error messages. You can still reuse the overall design by inheriting from a base template.
You replace variable values a lot, making it hard to follow what the meaning of variables like num, number and strnumber are throughout the code. Instead write functions which create the various transformations of the input that you need, making your variables unchanged throughout the code. For example:

def format_number(number):
    return number.replace(" ","").replace('+91', '').strip()


Now you can get from number to strnumber without ever changing the former.
In some error cases you render the template with error set, but in at least one you use a different error message delivery: dnd_list.append("The number should contain 10 digits"). This seems inconsistent.
The various large branches of code should be moved into separate functions.
Single letter variables like e, r and j make this code hard to maintain. Yes, it's kinda obvious from context, but the less context you have to keep in your head while developing, the better.