Как разместить форму django с AJAX & jQuery
Я проверил тонны учебников для форм django AJAX, но каждый из них говорит вам один способ сделать это, ни один из них не прост, и я немного смущен, так как я никогда не работал с AJAX.
у меня есть модель под названием "note", modelform для нее, и внутри шаблона мне нужно, чтобы каждый раз, когда элемент note отправляет сигнал stop () (из jQuery Sortables) django обновляет объект.
мой нынешний код:
views.py
def save_note(request, space_name):
"""
Saves the note content and position within the table.
"""
place = get_object_or_404(Space, url=space_name)
note_form = NoteForm(request.POST or None)
if request.method == "POST" and request.is_ajax:
msg = "The operation has been received correctly."
print request.POST
else:
msg = "GET petitions are not allowed for this view."
return HttpResponse(msg)
JavaScript:
function saveNote(noteObj) {
/*
saveNote(noteObj) - Saves the notes making an AJAX call to django. This
function is meant to be used with a Sortable 'stop' event.
Arguments: noteObj, note object.
*/
var noteID = noteObj.attr('id');
$.post("../save_note/", {
noteid: noteID,
phase: "Example phase",
parent: $('#' + noteID).parent('td').attr('id'),
title: $('#' + noteID + ' textarea').val(),
message: "Blablbla",
});
}
текущий код получает данные из шаблона и выводит его на терминал. Я не знаю, как я могу манипулировать этими данными. Я видел, как некоторые люди управляют данными через jqueryforms, чтобы отправить данные в django.
Как я могу получить доступ к данным, отправленным AJAX, и обновить объект note?
6 ответов:
поскольку вы используете jQuery, почему бы не использовать следующие:
<script language="JavaScript"> $(document).ready(function() { $('#YOUR_FORM').submit(function() { // catch the form's submit event $.ajax({ // create an AJAX call... data: $(this).serialize(), // get the form data type: $(this).attr('method'), // GET or POST url: $(this).attr('action'), // the file to call success: function(response) { // on success.. $('#DIV_CONTAINING_FORM).html(response); // update the DIV } }); return false; }); }); </script>
EDIT
Как указано в комментариях иногда выше не будет работать. Поэтому попробуйте следующее:
<script type="text/javascript"> var frm = $('#FORM-ID'); frm.submit(function () { $.ajax({ type: frm.attr('method'), url: frm.attr('action'), data: frm.serialize(), success: function (data) { $("#SOME-DIV").html(data); }, error: function(data) { $("#MESSAGE-DIV").html("Something went wrong!"); } }); return false; }); </script>
вы можете получить доступ к данным по запросу POST, используя имя переменной, в вашем случае:
request.POST["noteid"] request.POST["phase"] request.POST["parent"] ... etc
запрос.Объект POST является inmutable. Вы должны присвоить значение переменной, а затем управлять им.
Я бы посоветовал вам использовать этот плагин JQuery, так что вы можете написать обычные HTML-формы, а затем получить их "обновлен" до AJAX. Имеющий.$ сообщение везде в вашем коде довольно утомительно.
кроме того, используйте сетевое представление Firebug (для Firefox) или инструменты разработчика для Google Chrome, чтобы вы могли просматривать, что отправляется вами AJAX-вызовы.
что-то нужно искать при возврате формы в виде html, обрезанного до модального.
Views.py
@require_http_methods(["POST"]) def login(request): form = BasicLogInForm(request.POST) if form.is_valid(): print "ITS VALID GO SOMEWHERE" pass return render(request, 'assess-beta/login-beta.html', {'loginform':form})
простой вид, чтобы вернуть html отрезал
форма html обрезается
<form class="login-form" action="/login_ajx" method="Post"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="header">Authenticate</h4> </div> <div class="modal-body"> {%if form.non_field_errors %}<div class="alert alert-danger">{{ form.non_field_errors }}</div>{%endif%} <div class="fieldWrapper form-group has-feedback"> <label class="control-label" for="id_email">Email</label> <input class="form-control" id="{{ form.email.id_for_label }}" type="text" name="{{ form.email.html_name }}" value="{%if form.email.value %}{{ form.email.value }}{%endif%}"> {%if form.email.errors %}<div class="alert alert-danger">{{ form.email.errors }}</div>{%endif%} </div> <div class="fieldWrapper form-group has-feedback"> <label class="control-label" for="id_password">Password</label> <input class="form-control" id="{{ form.password.id_for_label }}" type="password" name="{{ form.password.html_name}}" value="{%if form.password.value %}{{ form.password.value }}{%endif%}"> {%if form.password.errors %}<div class="alert alert-danger">{{ form.password.errors }}</div>{%endif%} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> <input type="submit" value="Sign in" class="btn btn-primary pull-right"/> </div> </form>
страница, содержащая модальный
<div class="modal fade" id="LoginModal" tabindex="-1" role="dialog">{% include "assess-beta/login-beta.html" %}</div>
используйте тег include для загрузки обрезанной страницы, чтобы она была доступна при открытии модальный.
модала.js
$(document).on('submit', '.login-form', function(){ $.ajax({ type: $(this).attr('method'), url: this.action, data: $(this).serialize(), context: this, success: function(data, status) { $('#LoginModal').html(data); } }); return false; });
использование .на() в данном случае работают вроде .live () ключ привязывает событие отправки не к кнопке, а к документу.
поскольку другие ответы работают, я предпочитаю использовать jQuery Form Plugin. Он полностью поддерживает то, что вы хотите и больше. Представление post обрабатывается как обычно в части Django, просто возвращая HTML, который заменяется.
на стороне сервера ваш код django может обрабатывать сообщение AJAX так же, как он обрабатывает другие формы представления. Например,
views.py
def save_note(request, space_name): """ Saves the note content and position within the table. """ place = get_object_or_404(Space, url=space_name) note_form = NoteForm(request.POST or None) if request.method == "POST" and request.is_ajax(): print request.POST if note_form.is_valid(): note_form.save() msg="AJAX submission saved" else: msg="AJAX post invalid" else: msg = "GET petitions are not allowed for this view." return HttpResponse(msg)
я предположил, что ваша NoteForm является ModelForm - который он должен быть-так что он имеет метод сохранения. Обратите внимание, что в дополнение к добавлению тега
save()
команда, я изменил свойrequest.is_ajax
доrequest.is_ajax()
, который является то, что вы хотите (если вы используетеrequest.is_ajax
ваш код просто проверит, есть ли у запроса метод называетсяis_ajax
, что, очевидно, он делает).
большинство примеров использования AJAX POST с формами Django, включая официальный пример:
https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-editing/#ajax-example
в порядке
ModelForm.clean()
не выдал никаких ошибок (form_valid
). Однако они не выполняют трудную часть: переводModelForm
ошибки через AJAX-ответ на стороне клиента Javascript / DOM.мое подключаемое приложение использует маршрутизацию ответа AJAX с помощью клиентские просмотр моделей для автоматического отображения класса на основе "Аякса" в должности
ModelForm
ошибки проверки похожи на то, как они будут отображаться в традиционной HTTP POST:https://django-jinja-knockout.readthedocs.org/en/latest/forms.html#ajax-forms-processing https://django-jinja-knockout.readthedocs.org/en/latest/viewmodels.html
поддерживаются как Jinja2, так и Django Template Engine.