Какая разница между CreateView и если я выведу данные в template через def?
Используя CreateView или любые другие generic views штуки можно использовать ООП во вьюхах, наследоваться от них и например определять один и тот же общий context_data для CreateView/DetailView/UpdateView/TodayArchiveView, использовать Mixin.
Вообщем ООП преимущества которые помогут избежать дублирование кода если ваши вьюхи не банальны и имеют что-то общее, например обновление/создание/удаление/вывод списка с пагинацией для  одной  модели. 
Если нужна пагинация то я почти всегда использую generic views, потому что с ним это делается очень просто.
Class-based views просто более высокоуровневые, с ними меньше кода приходится писать.