2016-06-09 11 views
1

Здравствуйте, я Хав проблемы с Django, у меня есть эта ошибка:403 - CSRF маркера отсутствует или неправильно

CSRF лексемы отсутствует или неверна.

и мой код:

<h1>Registro de llamadas</h1> 


    <form action="{% url 'registro:guardar' %}" method="post"> 
    {% csrf_token %} 
    Duracion: <input type="text" name="duracion" /> </br> 
    Tipo de llamada: 
    <select name="tipo" form="carform"> 
     <option value="1">Local</option> 
     <option value="2">Nacional</option> 
     <option value="3">Internacional</option> 
    </select> 
</br> 
<input type="submit" value="Grabar" /> 
</form> 

{% if llamadas %} 
    <ul> 
    {% for ll in llamadas %} 
     <li><a href="a">{{ ll.duracion }}</a></li> 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>No tenemos ninguna llamada</p> 
{% endif %} 

и views.py у меня есть:

from django.http import HttpResponse 
from django.template import loader 


def index(request): 
    template = loader.get_template('registro/index.html') 
    return HttpResponse(template.render(request)) 


def guardar(request): 
    template = loader.get_template('registro/index.html') 
    return HttpResponse(template.render(request)) 

Пожалуйста некоторую помощь, я искал другой вопрос, но не решить мою проблему.

Чин!

+0

У вас есть '' django.middleware.csrf.CsrfViewMiddleware ', 'в настройках промежуточного программного обеспечения? –

+0

yes У меня есть CsrfViewMiddleware –

ответ

0

изменить view.py:

from django.views.decorators.csrf import csrf_exempt 
from django.shortcuts import render 

@csrf_exempt 
def guardar(request,username=None, errmsg=None): 
    template = 'registro/index.html' 
    ctx = {} 
    render(request, template, ctx) 
+0

нет, ничего не изменилось –

+0

Я отредактировал этот просмотр, попробуйте сделать еще раз –

+1

Пожалуйста, не рекомендуем 'render_to_response', он устарел от' render' годами. – Alasdair

2

Для лексемы CSRF работать правильно, вы должны включать в себя RequestContext при использовании шаблона.

Чтобы избежать дополнительного шаблона, это связано с тем, что django имеет функцию быстрого доступа, которая автоматически добавляет это для вас при рендеринге шаблона. Это django.shortcuts.render.

Чтобы использовать это изменение, ваше представление будет.

from django.shortcuts import render 

def guardar(request): 
    return render(request, 'registro/index.html', {}) 

Для получения дополнительной информации this page из документации Django является очень полезным.

1

Проблема заключается в том, что request является второй аргумент метода template.render(), но вы передаете его как первый.

Вы можете исправить свои взгляды следующим образом:

def index(request): 
    template = loader.get_template('registro/index.html') 
    return HttpResponse(template.render(request=request)) 

def guardar(request): 
    template = loader.get_template('registro/index.html') 
    return HttpResponse(template.render(request=request)) 

Как Саймон говорит в своем ответе, то проще использовать render ярлык вместо ручной загрузки и рендеринга шаблона.

from django.shortcuts import render 

def index(request): 
    return render(request, 'registro/index.html', {}) 

def guardar(request): 
    return render(request, 'registro/index.html', {}) 
Смежные вопросы