old_contents: """
  View which can render and send email from a contact form.
  
  """
  
  from django.core.urlresolvers import reverse
  from django.views.generic.edit import FormView
  
  from .forms import ContactForm
  
  
  class ContactFormView(FormView):
      form_class = ContactForm
      recipient_list = None
      template_name = 'contact_form/contact_form.html'
  
      def form_valid(self, form):
          form.save()
          return super(ContactFormView, self).form_valid(form)
  
      def get_form_kwargs(self):
          # ContactForm instances require instantiation with an
          # HttpRequest.
          kwargs = super(ContactFormView, self).get_form_kwargs()
          kwargs.update({'request': self.request})
  
          # We may also have been given a recipient list when
          # instantiated.
          if self.recipient_list is not None:
              kwargs.update({'recipient_list': self.recipient_list})
          return kwargs
  
      def get_success_url(self):
          # This is in a method instead of the success_url attribute
          # because doing it as an attribute would involve a
          # module-level call to reverse(), creating a circular
          # dependency between the URLConf (which imports this module)
          # and this module (which would need to access the URLConf to
          # make the reverse() call).
          return reverse('contact_form_sent')
  
new_contents: """
  View which can render and send email from a contact form.
  
  """
  
  from django.core.urlresolvers import reverse
  from django.views.generic.edit import FormView
  
  from .forms import ContactForm
  
  
  class ContactFormView(FormView):
      form_class = ContactForm
      recipient_list = None
      template_name = 'contact_form/contact_form.html'
  
      def form_valid(self, form):
          form.save()
          return super(ContactFormView, self).form_valid(form)
  
      def form_invalid(self, form):
          # tl;dr -- this method is implemented to work around Django
          # ticket #25548, which is present in the Django 1.9 release
          # (but not in Django 1.8).
          #
          # The longer explanation is that in Django 1.9,
          # FormMixin.form_invalid() does not pass the form instance to
          # get_context_data(). This causes get_context_data() to
          # construct a new form instance with the same data in order to
          # put it into the template context, and then any access to
          # that form's ``errors`` or ``cleaned_data`` runs that form
          # instance's validation. The end result is that validation
          # gets run twice on an invalid form submission, which is
          # undesirable for performance reasons.
          #
          # Manually implementing this method, and passing the form
          # instance to get_context_data(), solves this issue (which
          # will be fixed, at the very least, in Django 1.10, and may
          # also be backported into the Django 1.9 release series).
          return self.render_to_response(self.get_context_data(form=form))
  
      def get_form_kwargs(self):
          # ContactForm instances require instantiation with an
          # HttpRequest.
          kwargs = super(ContactFormView, self).get_form_kwargs()
          kwargs.update({'request': self.request})
  
          # We may also have been given a recipient list when
          # instantiated.
          if self.recipient_list is not None:
              kwargs.update({'recipient_list': self.recipient_list})
          return kwargs
  
      def get_success_url(self):
          # This is in a method instead of the success_url attribute
          # because doing it as an attribute would involve a
          # module-level call to reverse(), creating a circular
          # dependency between the URLConf (which imports this module)
          # and this module (which would need to access the URLConf to
          # make the reverse() call).
          return reverse('contact_form_sent')
  
subject: Work around Django ticket #25548 in ContactFormView.