Форум сайта python.su
0
Добрый день, уважаемые форумчане.
Решил попробовать поработать с Django и тут-же наткнулся на проблему, которую никак не могу разрешить.
Хочу сделать простую форму. Делаю один в один по официальному мануалу - http://djbook.ru/rel1.7/topics/forms/
Но при запуске получаю 403 - CSRF token missing or incorrect.
В интернетах нашёл массу инфы с примерами, но ни один из них не подошёл(
Прошу, помогите кто чем может, дайте реально работающий кусок кода или совет былого наставника.
Заранее спасибо.
Офлайн
221
Во-первых, это НЕ официальный мануал. Это русскоязычный перевод документации.
Во-вторых, Откуда мы можем догадаться что у вас там не правильно? Вы не предоставили ничего из того что сделали. Те примеры кода которые есть вполне рабочие.
Офлайн
0
views.py
# encoding: utf-8 from django.shortcuts import render, render_to_response, redirect from django.contrib import auth from django.contrib.auth.decorators import login_required from django.core.context_processors import csrf from django import forms from django.http import HttpResponseRedirect, HttpResponse from django.template import RequestContext class NameForm(forms.Form): your_name = forms.CharField(label='Your name', max_length=100) def get_name(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = NameForm(request.POST) # check whether it's valid: if form.is_valid(): # process the data in form.cleaned_data as required # ... # redirect to a new URL: return HttpResponseRedirect('/thanks/') # if a GET (or any other method) we'll create a blank form else: form = NameForm() return render(request, 'blog/name.html', {'form': form})
<form action="/your-name/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit" /> </form>
urlpatterns = [ url(r'^$', 'Appl_1.views.get_name'), ]
Офлайн
221
Подробнее про CSRF
В вашем случае вы не передаете csrf, поэтому вам вполне резонно говорят что он пропущен. Вот один из примеров
def my_view(request): c = {} c.update(csrf(request)) # ... view code here return render_to_response("a_template.html", c)
Офлайн
0
Вот видите, пример приведенный в переводе документации? из коробки таки не работает.
Данный Вами пример я пробовал применять, но как и много других он не дал результата, к сожалению.
Тем более он не подходит для моих нужд, т.к. мне нужно передать - {'form': form}.
Также не сработал вариант с RequestContext.
Офлайн
221
Mahabharata871
. мне нужно передать - {'form': form}.
def my_view(request): c = {} c.update(csrf(request)) # ... view code here c['form'] = form return render_to_response("a_template.html", c)
Mahabharata871ТАм ниже есть заметка об этом. Но согласен, выглядит странно для примера. Тем не менее разобраться вполне можно.
из коробки таки не работает.
Офлайн
221
я счаз смотрю на рабочий код одного проекта, который написан по документации. И все там работает.
Офлайн
0
Видите-ли в чем загадка: когда в форме прописан {% csrf_token %} - то проект не запускается вообще, т.е. сразу выдает ошибку, а когда я сношу токен, то я вижу форму, ввожу данные, нажимаю сабмит и только тогда вижу ошибку - Forbidden (CSRF token missing or incorrect.): /your-name/
И, кстати, урл уже другой страницы, куда у меня перенаправление идёт:
def name(request): my_name = request.POST message = "<p>hello, %s!</p>" %my_name return HttpResponse(message)
Офлайн
221
нет это только для форм которые отправлены через POST.
Mahabharata871
Mahabharata871Ну вот эту ошибку надо и показать.
сразу выдает ошибку,
Офлайн
0
Прошу прощения, не привык на форумах писать, поэтому забываюсь)
Вот что получаю, когда токен прописан:
KeyError at /
u'% csrf_token %'
settings.py настроен как следует? - ну там всё из коробки, ничего не менял, но согласно всё тех-же рекомендаций на русском, всё подключено как надо. Хотя понимаю, что могут и ошибаться))
Офлайн