Я использую http://code.google.com/p/django-widgets/ с проектом, на мой взгляд, я использую AJAX для отправки электронного письма следующим образом:
def contact_submit(request):
form = ContactForm(data=request.POST)
ajax = request.is_ajax()
if form.is_valid():
form.save();
name = form.cleaned_data['name']
phone = form.cleaned_data['phone']
email = form.cleaned_data['email']
company = form.cleaned_data['company']
comment = form.cleaned_data['comments']
send_email(name, company, phone, email, comment)
if ajax:
return HttpResponse('{"success":true}')
else:
return redirect( request.META['HTTP_REFERER'] )
else:
if ajax:
return HttpResponse('{"success":false}')
else:
return redirect( request.META['HTTP_REFERER'] )
Моя проблема в том, что csrf_token в моем шаблоне не отображается. Я понимаю, что это потому, что у меня нет RequestContext в моем шаблоне, но как я могу заставить csrf_token отображаться с этим?
Я подумал, может быть, я могу каким-то образом передать контексты, где форма вызывается в пакете django-widgets, но я не уверен, как это сделать, поскольку здесь нет запроса... вот где форма вызывается widgets.py:
from django_widgets.base import Widget
from contact.forms import ContactForm
class ContactFormWidget(Widget):
template = "contact/contact.html"
def get_context(self):
return {"contact_form":ContactForm()}
Я тоже думал, может быть, в классе Widgets, но опять же, здесь тоже нет объекта запроса:
from django.template.loader import get_template
from django.template.context import Context
from django.core.exceptions import ImproperlyConfigured
from django_widgets import loading
class WidgetBase(type):
def __new__(cls, name, bases, attrs):
# Make sure the Widget was specified properly
if 'template' not in attrs:
raise ImproperlyConfigured, "%s must specify a template." % name
# Create the class.
widget = type.__new__(cls, name, bases, attrs)
# Register the class for future reference
loading.registry.register(name, widget)
return widget
class Widget(object):
__metaclass__ = WidgetBase
template = ""
ctx = {}
login_required = False
def __init__(self):
self.user = ''#user
def get_context(self):
"""
Provide any additional context required by the widget.
This would be overridden when necessary.
"""
return self.ctx
def render(self):
"""
Render the widget's template and return the rendered contents.
"""
template = get_template(self.template)
data = self.get_context()
data.update(widget=self, user=self.user)
return template.render(Context(data))
Любые предложения приветствуются :)
Спасибо
Джефф