/ / RequestContext avec django-widgets pour que CSRF fonctionne - django, django-forms

RequestContext avec django-widgets pour que CSRF fonctionne - django, django-forms

j'utilise http://code.google.com/p/django-widgets/ avec un projet, à mon avis, j'utilise AJAX pour envoyer un e-mail comme ceci:

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"] )

Mon problème est que le csrf_token dans mon modèle ne s'affiche pas. Je comprends que c'est parce que je n'ai pas le RequestContext dans mon modèle, mais comment pourrais-je obtenir csrf_token à afficher avec cela?

J'ai pensé que je pourrais peut-être passerContextes où le formulaire est appelé dans le package django-widgets mais je ne sais pas comment, car il n'y a pas de demande ici ... voici où le formulaire est appelé 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()}

J'ai aussi pensé que peut-être dans la classe Widgets, mais encore une fois, aucun objet de requête ici non plus:

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))

Toutes les suggestions sont les bienvenues :)

Merci

Jeff

Réponses:

0 pour la réponse № 1

Votre code n'a jamais réellement crée une RequestContext , qui nécessite d'importer et d'appeler la fonction appropriée. Voir le lien pour le code, ou cette autre question csrf pour plus d'exemples.

Notez que si vous utilisez HttpResponse, vous devez créer votre propre contexte, tandis que render_to_response est un raccourci qui le fait pour vous.