From 647feb73a2c3cbcc30244a022da04f5be3aa3346 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Sat, 7 May 2011 15:11:11 -0400 Subject: support contact form [WIP] --- piccast/contact_form/views.py | 92 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 piccast/contact_form/views.py (limited to 'piccast/contact_form/views.py') diff --git a/piccast/contact_form/views.py b/piccast/contact_form/views.py new file mode 100644 index 0000000..ad603f5 --- /dev/null +++ b/piccast/contact_form/views.py @@ -0,0 +1,92 @@ +""" +View which can render and send email from a contact form. + +""" + +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import render_to_response +from django.template import RequestContext + +from contact_form.forms import ContactForm + + +def contact_form(request, form_class=ContactForm, + template_name='contact_form/contact_form.html', + success_url=None, extra_context=None, + fail_silently=False): + """ + Render a contact form, validate its input and send an email + from it. + + **Optional arguments:** + + ``extra_context`` + A dictionary of variables to add to the template context. Any + callable object in this dictionary will be called to produce + the end result which appears in the context. + + ``fail_silently`` + If ``True``, errors when sending the email will be silently + supressed (i.e., with no logging or reporting of any such + errors. Default value is ``False``. + + ``form_class`` + The form to use. If not supplied, this will default to + ``contact_form.forms.ContactForm``. If supplied, the form + class must implement a method named ``save()`` which sends the + email from the form; the form class must accept an + ``HttpRequest`` as the keyword argument ``request`` to its + constructor, and it must implement a method named ``save()`` + which sends the email and which accepts the keyword argument + ``fail_silently``. + + ``success_url`` + The URL to redirect to after a successful submission. If not + supplied, this will default to the URL pointed to by the named + URL pattern ``contact_form_sent``. + + ``template_name`` + The template to use for rendering the contact form. If not + supplied, defaults to + :template:`contact_form/contact_form.html`. + + **Context:** + + ``form`` + The form instance. + + **Template:** + + The value of the ``template_name`` keyword argument, or + :template:`contact_form/contact_form.html`. + + """ + # + # We set up success_url here, rather than as the default value for + # the argument. Trying to do it as the argument's default would + # mean evaluating the call to reverse() at the time this module is + # first imported, which introduces a circular dependency: to + # perform the reverse lookup we need access to contact_form/urls.py, + # but contact_form/urls.py in turn imports from this module. + # + + if success_url is None: + success_url = reverse('contact_form_sent') + if request.method == 'POST': + form = form_class(data=request.POST, files=request.FILES, request=request) + if form.is_valid(): + form.save(fail_silently=fail_silently) + return HttpResponseRedirect(success_url) + else: + form = form_class(request=request) + + if extra_context is None: + extra_context = {} + context = RequestContext(request) + for key, value in extra_context.items(): + context[key] = callable(value) and value() or value + + return render_to_response(template_name, + { 'form': form }, + context_instance=context) -- cgit v1.2.3