Почему {{ form }} представляет экземпляр формы в файле шаблона?

Согласно django official doc,

Все, что вам нужно сделать, чтобы поместить вашу форму в шаблон, это поместить экземпляр формы в контекст шаблона. Таким образом, если ваша форма в контексте называется form, {{ form }} будет отображать ее элементы <label> и <input> соответствующим образом.

Где в исходном коде django экземпляр формы назван/определен как form для контекста шаблона? И как я могу изменить название на что-то другое {{ my_form }}, например?

При рендеринге представления в Views.py вы можете сделать следующее, чтобы изменить имя формы, которую вы рендерите:

Views.py

from .forms import MyForm1

def MyForm(request):
    my_form = Myform1
    return render(request , 'MyForm.html' , {'my_form' : my_form})

Затем при вызове вашей формы на HTML-странице вы можете вызвать ее как

{{ my_form }}

Как вы метко сказали в своем комментарии:

Под контекстом понимается хранилище данных, используемых для визуализации с помощью HTML файлы шаблонов.

Что касается того, как form передается в контекст, если вы используете представление на основе функции, это полностью зависит от вас, с каким ключом вы передаете форму, например, нижеприведенный код будет передавать его как my_form:

return render(request, 'template.html', {'my_form': my_form})

В случае представления на основе класса большинство из них наследуют от ContextMixin, который объявляет метод get_context_data, используемый для передачи переменных в контекст. Все представления на основе классов, которые имеют дело с формами, также наследуются от FormMixin, глядя на его исходный код он переопределяет get_context_data для передачи формы в контекст:

def get_context_data(self, **kwargs):
    """Insert the form into the context dict."""
    if 'form' not in kwargs:
        kwargs['form'] = self.get_form()
    return super().get_context_data(**kwargs)

Конечно, вы можете решить снова переопределить get_context_data самостоятельно и передать форму с другим именем, но это будет не очень полезно:

class YourView(CreateView):
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['my_form'] = context['form']
        return context
Вернуться на верх