мне это не кажется таким уродливым: у вас есть функция, у вас достаточно параметров, чтобы изменить поведение функции, и у вас есть разумные значения по умолчанию, так что вам не нужно указывать все аргументы при каждом вызове функции.
есть возможность упаковать функцию в класс: в конструкторе класса вы указываете все те значения, которые являются частью списка параметров, и у вас есть специальный метод без аргументов для выполнения основной функции.
что-то вроде этого:
class ContactForm(object):
def __init__( self,
subj_tmpl='contato/subject.txt',
msg_tmpl='contato/msg.html',
template='contato/contato.html',
success_template='contato/success.html',
success_redir='/',
append_message=None):
self.subj_tmpl = subj_tmpl
self.msg_tmpl = msg_tmpl
self.template = template
self.success_template = success_template
self.success_redir = success_redir
self.append_message = append_message
def __call__( self, request, sender=settings.DEFAULT_FROM_EMAIL ):
# do something
# use case:
contact = ContactForm()
contact( req, sndr )
(я догадался, какие значения зависят от сайта, а какие от пользователя, исходя из названий параметров.приложение, адаптировать его так, как вы хотите)