L'erreur est à l'emplacement http://127.0.0.1:8000/fileupload/form.py
J'ai la version 1.3 de Django. J'ai essayé de spécifier localhost: 8000 comme indiqué dans la question de quelqu'un d'autre, mais cela n'a pas fonctionné pour moi. J'essaie d'avoir un formulaire de téléchargement de fichier mais je reçois une erreur indiquant que form.py ne possède pas le jeton CSRF.
form.py:
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
views.py:
def upload_file(request):
c = {}
c.update(csrf(request))
if (not request.user.is_authenticated()) or (request.user == None):
return HttpResponseRedirect("/?error=11")
if request.method == 'POST':
form = c['UploadFileForm'] = UploadFileForm(request.POST, request.FILES, c, context_instance=RequestContext(request))
if c['UploadFileForm'].is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = c['UploadFileForm'] = UploadFileForm()
return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']})
upload.html:
{% block main_content %}
<form action="fileupload/form.py" enctype="multipart/form-data" method="POST">
{% csrf_token %}
<table>
<tr><td>Title:</td><td><input type="text" name="title" /></td></tr>
<tr><td>File:</td><td><input type="file" name="file" /></td></tr>
</table>
<input type="submit" value="Submit" class = "float_right button_input" />
</form>
{% endblock main_content %}
Je suis très perplexe s'il vous plaît dites-moi quelques choses à essayer. Je vous remercie
Vous devez passer RequestContext
dans render_to_response pour csrf_token
Pour cela: ( views.py )
from Django.template import RequestContext
...
return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}, RequestContext(request))
# Added RequestContext
Cela transmet le jeton pour csrf au modèle.
Ma réponse est similaire à celle de @Yugal Jindle ci-dessus.
J'utilise Django 1.10 et j'ai eu un problème similaire, cela a fonctionné pour moi après l'édition
return render_to_response(param1, param2)
à
return render(request, param1, param2)
P.S. Assurez-vous d'avoir la ligne ci-dessous dans votre variable MIDDLEWARE dans le fichier settings.py
'Django.middleware.csrf.CsrfViewMiddleware'
Cela peut également arriver si vous utilisez des décorateurs @cache_page(60 * 15)
. Si vous mettez en cache une page avec un formulaire contenant un jeton CSRF, vous mettrez en cache le jeton CSRF du premier utilisateur uniquement. Il est donc parfois difficile de déboguer.
Plus d'infos sur Documentation Django
Si la balise de modèle csrf_token est utilisée par un modèle (ou si la fonction get_token Est appelée autrement), CsrfViewMiddleware ajoute un. cookie et un en-tête Vary: Cookie à la réponse. Cela signifie que le le middleware jouera bien avec le middleware de cache s'il est utilisé comme demandé (UpdateCacheMiddleware passe avant tout autre middleware).
Toutefois, si vous utilisez des décorateurs de cache sur des vues individuelles, le fichier CSRF le middleware n'aura pas encore été en mesure de définir l'en-tête Vary ou le Le cookie CSRF et la réponse seront mis en cache sans l’un ni l’autre Dans Dans ce cas, sur toutes les vues nécessitant l'insertion d'un jeton CSRF vous devriez utiliser Django.views.decorators.csrf.csrf_protect () décorateur d'abord:
from Django.views.decorators.cache import cache_page from Django.views.decorators.csrf import csrf_protect @cache_page(60 * 15) @csrf_protect def my_view(request): ...