path('/', views.product_list, name='by_product_type'),
path('/', views.product_list, name='by_main_category'),
path('/', views.product_list, name='product_list_by_category'),
А как вы собрались отличать эти урлы? Например, запрошен урл /hz4to/ - это в какую строку пойдет? hz4to - это тип, главная категория или просто категория?
Конкретно по ошибке: у вас всегда срабатывает урл by_product_type.
Соответственно, если на самом деле запрошена категория, то вот эта срока дает 404:
product_type = get_object_or_404(ProductType, slug=type_slug)