Как обрабатывать csrf_token?

Ребят, всем привет.

Проблема: форма отдает {% csrf_token %}, но вот вьюшкой принять её и обработать не получается.

Сама форма

{% block login1 %}
    <div class="large-offset-3 large-6 columns">
		<form action="/auth/login/" method="post">
			{% csrf_token %}
			<label for="username">Имя пользователя</label>
			<input type="text" name="username" id="username">
			<label for="password">Пароль</label>
			<input type="password" name="password" id="password">
			{% if login_error %}
			    <label class="error">{{ login_error }}</label>
			{% endif %}
		    <input class="button" type="submit" value="Войти">
		</form>
	</div>
{% endblock %}


Сама вьюшка - взял способ с нета

def login(request):
    args = {}
    args.update(csrf(request))
    if request.POST:
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect('/')
        else:
            args['login_error'] = "Пользователь не найден"
            return render_to_response('login.html', args)
    else:
        return render_to_response('login.html', args)


В итоге, появляется ошибка, что токена нет, либо он битый. Если например закрываю вьюшка декоратором @csrf_exempt (выключая токен), то форма сама отрабатывает на ура. Подскажите, плиз.

Плюс есть беда вот с такой вьюшкой тоже (тоже токен не знаю, как обработать):

def addcomment(request, step_id):
    # args = {}
    # args.update(csrf(request))
    if request.POST and ('stop_comment' not in request.session):
        mentionn = Step(id=step_id)
        mention_text = request.POST.get('mention_text', '')
        mention_digit = request.POST.get('mention_digit', '')
        mentionn_obj = Mention(mentionn=mentionn, mention_text=mention_text, mention_digit=mention_digit)
        mentionn_obj.save()
        request.session.set_expiry(864000) #Блок функции сессией на 10 дней.
        request.session['stop_comment'] = True
    return redirect('/step'+ step_id)
  • Вопрос задан
  • 437 просмотров
Пригласить эксперта
Ответы на вопрос 2
потому что в джанге не так работают с формами. Не нужно придумывать свой велосипед. он уже придуман и хорошо интегрирован.
вот тут есть не скучная документация а живой примерчик - tutorial.djangogirls.org/ru/django_forms/index.html
Ответ написан
zelsky
@zelsky
Добавьте при не правильном заполнении
args.update(csrf(request))

def register_user(request):
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)     # create form object
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/register/')
        else:
            print (form.errors)
    args = {}
    args.update(csrf(request))
    args['form'] = MyRegistrationForm()
    print (args)
    return render(request, 'register.html', args)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы