-
Notifications
You must be signed in to change notification settings - Fork 0
/
views.py
95 lines (77 loc) · 3.47 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
"""
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',
custom_template_name='contact_form/contact_form.txt',
custom_template_subject='contact_form/contact_form_subject.txt',
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.template_name=custom_template_name
form.subject_template_name=custom_template_subject
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)