#jquery #python #ajax #django #reload
#jquery #python #ajax #django #перезагрузите
Вопрос:
Я изучал Django jQuery и до сих пор смог реализовать AJAX-ify новую функциональность Post. Теперь мой вопрос заключается в том, как мне красиво и легко отобразить новую запись в списке записей AJAX-ly?
views.py:
def add_post(request):
error_msg = u"No POST data sent."
post = Post()
if request.method == "POST":
#do stuff
return HttpResponse("success")
Пока я могу вернуть «успех» и сохранить новое сообщение просто отлично.
jQuery:
$("form#add_post").submit(function() {
//do stuff
var args = {type:"POST", url:"add_post/", data:data, complete:function(res, status) {
if (status == "success") {
alert("success");
} else {
}
}};
$.ajax(args);
return false;
})
Просто сообщаю здесь «успех», и это отлично работает. Я могу увидеть новую запись в списке записей, если обновлю страницу. Теперь, как мне загрузить новую запись AJAX-ly? Должен ли я брать атрибуты Post и добавлять их к моему DIV вручную? Есть ли простой способ просто перезагрузить мой список записей?
Спасибо!
Ответ №1:
Почему бы вам просто не вернуть HTML для post the в результате успешного возврата и использовать jQuery, чтобы добавить его туда, где он должен быть на вашей странице. Это то, что я обычно делаю в своем коде, это быстро и просто. Возможно, для более сложных решений вы захотите вернуть список объектов JSON и использовать фреймворк javascript, такой как backbone.js
Комментарии:
1. Спасибо за ваш ответ. На самом деле это то, чего я хотел избежать, создавая HTML вручную. Поскольку у меня есть цикл
{% for object in object_list %}
, который отображает все записи при загрузке страницы, я надеялся, что смогу просто каким-то образом перезапустить это. Я подумал, что так будет более органично, вместо того, чтобы создавать HTML вручную и добавлять к нему дополнения.2. Нет, это не значит, что вы должны создавать его «вручную». У вас может быть шаблон, который определяет HTML для 1 сообщения. И это может быть включено в
{% for object in object_list %}
. А затем также в режиме сохранения ajax после успешного отображения шаблона в виде строки для вновь созданного объекта и возврата результирующего HTML.response = {'success': 1, 'html': mark_safe(render_to_string('my_template', context, context_instance=RequestContext(request)))}
3. @rabbid: «повторный запуск» это также возможно, если этот список записей загружен на страницу через отдельный AJAX-запрос. Тогда вам нужно будет только вызвать AJAX списка записей в вашей функции сохранения
complete
в случае успеха. Но я думаю, что метод, описанный @Dominic, более эффективен, поскольку вам не нужно делать никаких дополнительных запросов.4. Хммм, думаю, я понимаю, что вы имеете в виду, но сначала мне придется попробовать. Большое спасибо!
Ответ №2:
Вот фиктивный способ;
views.py:
def add_post(request):
error_msg = u"No POST data sent."
post_instance = Post()
if request.method == "POST":
# I love Rock'nRoll
return post_instance
return HttpResponse(json.dumps({'status': 'success', 'object': post_instance}))
В части шаблона используйте $.getJSON
или $.ajax
, чтобы перехватить json
объект из вашего views.py
и, если это так success
, .append()
вернуть post_instance
объект в список.
Ответ №3:
В вашей серверной службе Django вам необходимо предоставить некоторую информацию, связанную с логикой вашего приложения. В основном, люди склонны использовать JSON для этого.
def add_post(request):
error_msg = u"No POST data sent."
post = Post()
if request.method == "POST":
#do stuff
response = HttpResponse(content_type = 'application/javascript')
data = dict()
#here it comes your logic
#that fills 'data' with whichever
#information you need.
data['message']='post added !!'
response.write(json.dumps(data))
return response
else:
return HttpResponse("NO POST REQUEST HANDLE")
Ваша клиентская сторона рядом с обработкой этого ответа в соответствии с данными, записанными в HttpResponse
объекте.
complete: function(res, status) {
//In here you can do whatever you want to modify your
//HTML dynamically
// the variable res contains the JSON object dumped in the
// django HTTPResponse object.
$("#message").text = res['message'];
}
error: function(res, status) {
$("#message").text = "error handling ajax request";
}
Убедитесь, что вы обрабатываете оба error
и complete
обратные вызовы.
В приведенном мной примере вам понадобится HTML-элемент с message
идентификатором as, т.е.:
<div id="message"></div>
Комментарии:
1. Для вашего add_post вы должны установить миметип ответа application / javascript: вернуть HttpResponse(json.dumps(данные), mimetype=’application / javascript’)