Django jQuery post запрос
$.ajax({
url:'/',
type: "POST",
data: {name: 'name', age: 'age'},
success:function(response){},
complete:function(){},
error:function (xhr, textStatus, thrownError){}
});
и в views.py:
class SomeView(generic_views.TemplateView):
template_name = 'something.html'
def get(self, request, *args, **kwargs):
...something...
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
name = request.POST['name']
age = request.POST['age']
...something...
а я: [05 / Oct / 2012 12:03: 58] "POST /something/ HTTP/1.1" 403 2294
Я хотел бы отправить эти данные (имя и возраст) через jQuery в эту функцию post в "SomeView". Это то же представление, что и загруженный шаблон, только тип запроса отличается. При загрузке шаблона get() и post следует вызвать функцию post (). Возможно ли это? Я проверил другие вопросы и получил это решение. Это было должен был работать. Что я делаю не так?
3 ответов
ответ на ваш вопрос, что вы делаете неправильно, это не много!
Django возвращает ответ 403 (запрещено), если входящий запрос POST не проверяет Csrf. Вы можете сделать это через ajaxSetup jQuery, фрагменты кода найдены здесь
причина, по которой это работает с запросом GET, заключается в том, что запросы GET не проверяются промежуточным программным обеспечением csrf.
как кажется, вы строите форму здесь, еще одна вещь, чтобы рассмотреть это использование форм на основе классов. Они обрабатывают get / post, а также проверку параметров для вас. Очень аккуратно. Особенно, когда вы создаете формы для редактирования/создания / удаления экземпляров модели, в этом случае вы можете использовать силу ModelForms и CreateViews. Очень аккуратно.
может потребоваться некоторое время, чтобы получить представление этих общих представлений на основе классов. Но оно того стоит.
вам нужно включить CSRF (подделка межсайтового запроса) токен в вашем вызове ajax. Это хорошо документировано здесь:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
или, если вы хотите использовать быстро исправить, используйте @csrf_exempt
декоратор для вашего взгляда:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
...
в шаблоне Django вы можете добавить это...
{% csrf_token %}
который выведет что-то вроде этого на вашу страницу html...
<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz">
затем, используя Javascript, вы можете просто найти этот вход и получить его значение-что-то вроде этого примера non jQuery...
var el = document.getElementsByName("csrfmiddlewaretoken");
csrf_value = el[0].getAttribute("value");
наконец, добавьте csrf_value в строку данных формы jQuery AJAX post, например...
data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value},
вот рабочая концепция jsFiddle: https://jsfiddle.net/vdx1Lfpc/18/