This is not specific to Django. What you are really asking is when to use an HTTP 400 ("Bad Request") status code. In general, any page that you successfully render to the user should get a 200-level code. Any request where there is a server-side failure should get a 500-level code. The 400-level codes are intended for cases where the request failed but was due to a client rather than server error. For example, the 404 is for a case where the URL corresponds to a path that does not exist on the server.
A typical case where one uses a 400 status code is for an HTTP request that gets sent to a valid, supported path, where the request parameters (e.g. the GET or POST parameters) are incorrect (required parameters are missing or parameters have values that are not of the right type, not in the allowed ranges, or not a valid enum value in the case of enum parameters). This should pretty much never happen in a user-issued request (since other parts of your application should generate only well-formed requests) and is significantly more common for APIs that you create for other developers (or for yourself). That is, if a request is failing and you see it is a 400, you can pretty quickly diagnose that the parameters need to be altered for it to work correctly. If that's what you mean by "where a view receives incorrect input", then that seems reasonable to me; however, "under the wrong circumstances" seems like an incorrect usage of a 400 status code. For the "under the wrong circumstances" case, there may be more appropriate status codes, depending on what you mean by "the wrong circumstances".
I should emphasize, however, that there is no exact right answer. When choosing which error codes to use, important considerations include: internal consistency between resources within the same site, understandibility/expectation by developers using your API (if you are creating an API), how the various status codes are interpreted by the browser, proxies, and search engines.