Skip to content

Instantly share code, notes, and snippets.

@joshcartme
Last active December 14, 2015 18:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save joshcartme/5130702 to your computer and use it in GitHub Desktop.
Save joshcartme/5130702 to your computer and use it in GitHub Desktop.
Mezzanine Form ajax processing
# template tag
from mezzanine import template
from mezzanine.forms.forms import FormForForm
from mezzanine.pages.models import Page
register = template.Library()
@register.as_tag
def form_from_page(slug):
try:
page = Page.objects.get(slug=slug)
except Page.DoesNotExist:
return None
return FormForForm(page.form, None, None)
# page processor:
from django.http import HttpResponse
from django.shortcuts import redirect
from django.utils import simplejson
from mezzanine.conf import settings
from mezzanine.forms.forms import FormForForm
from mezzanine.forms.models import Form
from mezzanine.forms.page_processors import format_value
from mezzanine.forms.signals import form_invalid, form_valid
from mezzanine.pages.page_processors import processor_for
from mezzanine.utils.email import send_mail_template
from mezzanine.utils.views import is_spam
@processor_for(Form)
def ajax_form_processor(request, page):
"""
Handle a Mezzanine form submissions if and only if the request
is ajax, otherwise the default processor will run.
"""
if request.is_ajax():
form = FormForForm(page.form, request.POST or None, request.FILES or None)
if form.is_valid():
url = page.get_absolute_url() + "?sent=1"
if is_spam(request, form, url):
return redirect(url)
entry = form.save()
subject = page.form.email_subject
if not subject:
subject = "%s - %s" % (page.form.title, entry.entry_time)
fields = [(v.label, format_value(form.cleaned_data[k]))
for (k, v) in form.fields.items()]
context = {
"fields": fields,
"message": page.form.email_message,
"request": request,
}
email_from = page.form.email_from or settings.DEFAULT_FROM_EMAIL
email_to = form.email_to()
if email_to and page.form.send_email:
send_mail_template(subject, "email/form_response", email_from,
email_to, context, fail_silently=settings.DEBUG)
if not settings.FORMS_DISABLE_SEND_FROM_EMAIL_FIELD:
# Send from the email entered,
# unless FORMS_DISABLE_SEND_FROM_EMAIL_FIELD is True.
email_from = email_to or email_from
email_copies = page.form.email_copies.split(",")
email_copies = [e.strip() for e in email_copies if e.strip()]
if email_copies:
attachments = []
for f in form.files.values():
f.seek(0)
attachments.append((f.name, f.read()))
send_mail_template(subject, "email/form_response", email_from,
email_copies, context, attachments=attachments,
fail_silently=settings.DEBUG)
form_valid.send(sender=request, form=form, entry=entry)
return HttpResponse(simplejson.dumps({'error': False, 'message': page.form.response}),
mimetype='application/json')
form_invalid.send(sender=request, form=form)
return HttpResponse(simplejson.dumps({'error': True, 'message': '<p>Please submit valid data</p>' }),
mimetype='application/json')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment