Here is the standard layout:
├── apps/
| ├── [app]/
| | ├── __init__.py
| | ├── urls.py
| | ├── models.py
| | ├── forms.py # Forms
| | ├── admin.py
| | ├── views.py
| | ├── migrations/
| | ├── management/
| | ├── templates/ # Here or in the project root
| | └── (other)
| |
| └── __init__.py
|
...
In short: keep all forms relevant to the app in the app. It's conceptually consistent, intuitive and makes code more maintainable (by separation).
Multi-app forms/components are rather rare. You can keep them in app named "common". This is a very popular convention.
This way you can import forms
into views
without a hassle:
from .forms import FormA, FormB
# or
from . import forms
# or
from .forms import *
# and from common:
from ..common import forms as common_forms
Regarding your second question: absolutely - if benefits of the separation (such clean project layout, maintainability, more verbose filenames) are worth the trouble (e.g. of importing multiple files instead of one). There are no hard rules, so you must calculate the trade-offs and decide.