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 № 1Votre 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.