отображение нового объекта Django с помощью jQuery

#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’)