RequestContext с django-widgets, чтобы работал CSRF

Я использую 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))

Любые предложения приветствуются :)

Спасибо

Джефф


person tdelam    schedule 29.07.2011    source источник


Ответы (1)


Ваш код на самом деле никогда не создает RequestContext, который требует импорта и вызова соответствующей функции. См. ссылку для кода или этот другой вопрос csrf для получения дополнительных примеров.

Обратите внимание, что если вы используете HttpResponse, вам нужно создать свой собственный контекст, тогда как render_to_response — это ярлык, который сделает это за вас.

person John C    schedule 30.07.2011
comment
Эй, Джон, я знаю, что на самом деле я не создаю объект RequestContext, я не отображаю ответ, я перенаправляю через вызов ajax из класса, который загружает шаблон. Поэтому мне было интересно, как я могу получить доступ к объекту RequestContext, чтобы отобразить токен csrf в моем шаблоне. Я смог сделать это, переопределив конструктор в моей форме, но я буду проводить рефакторинг, когда найду лучший способ загрузки этих фрагментов через ajax, кажется грязным. - person tdelam; 02.08.2011