Как лучше всего передать данные формы django в javascript ajax вызов?
У меня есть форма с определенным количеством полей, использующая вызов ajax для связи с сервером. И мне интересно, какой лучший способ передать данные, которые я получаю из request.post формы, и передать их обратно в свойство success javascript ajax.
Вот пример:
def ajaxView(request):
form = MyForm(request.POST or None)
if request.is_ajax() and form.is_valid():
#1 I used to use render_to_string and Parse it in the js
#2 or get field by field using the request.POST.get method and return it
#3 is to serialize the form
return JsonResponse({})
return ""
В js-файле:
function CreateAjax(e) {
e.preventDefault();
$.ajax({
url: "/ajaxViewUrl/",
type: "post",
data: $("#idForm").serialize(),
success: function (data) {
// if the first option retreive fields by field after parse
},
error: () => {
}
});
}
Теперь это не будет проблемой, если форма имеет небольшое количество полей, меня беспокоит, когда форма имеет значительное количество полей, и в любом случае я хотел бы уменьшить повторение получения значений входов в форме.
Следует обратить внимание на то, что форма возвращается в виде 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-фрагмента
Form html Snipped
<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>
Страница, содержащая модальную
{% include "assess-beta/login-beta.html" %}Используйте тег include для загрузки фрагмента при загрузке страницы, чтобы он был доступен при открытии модала.
Modal.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;
});
Использование .on() в этом случае работает как .live(), главное - привязать событие submit не к кнопке, а к документу.