Как обновить шаблон Django после изменения серверной части - PullRequest
0 голосов
/ 27 августа 2018

все. Я начинаю с Python и Django и хочу добавить Ajax в мой код.

Я практикуюсь, показывая продукт на шаблоне вместе с вводом, чтобы изменить его цену. Я смог изменить его значение в БД, но после этого я хотел бы обновить контекст шаблона, чтобы увидеть новое значение. Поле, которое я хочу получить, является последней строкой таблицы.

{% csrf_token %}
<table>
<tr>
  <th>Product</th>
  <td>{{product.name}}</td>
</tr>
<tr>
  <th>Price</th>
  <td><input id="price" type="text" value="{{product.price}}" placeholder="Price" autocomplete="off"/></td>
</tr>
<tr>
  <td colspan="2" style='background:none'><input id="send" type="button" value="Update"/></td>
</tr>
<tr>
  <th>Current values:</th>
  <td>{{product.name}} : ${{product.price}}</td>
</tr>
</table>

JS:

$("#send").click(function(){
  $.post("/inicio/acciones/update/", {search: 1, price : $("#price").val()} ).done(function(res){
})

});

Backend

def update(request):
  """backend changes
  ...
  """

  t = loader.get_template('inicio/index.html')
  product= Product.objects.get(pk=search)
  context = {
    'product' : product,
  }
  t.render(context)
  return HttpResponse(product.price)

Var 'product' имеет правильные значения, но мой шаблон не обновляется.

Как мне обновить контекст?

1 Ответ

0 голосов
/ 27 августа 2018

Поскольку вы используете AJAX, я предполагаю, что независимо от того, какую операцию вы пытаетесь выполнить, вы хотите делать это без перезагрузки всей страницы.

  1. Если это так ...
    • Шаблоны Django не помогут вам. По крайней мере, не так, как вы думаете. Шаблоны Django генерируют HTML на основе предоставленной им информации. Это выглядит как вы возвращаете желаемый набор запросов клиенту в вашем ответе AJAX. Кто-то поправит меня, если я ошибаюсь, но Джанго умен и тут возвращается ваш набор запросов как уже хорошо отформатированный ответ JSON. Как только ваш клиент имеет ответ, до JavaScript, работающего на клиенте для отображения информации так, как вы хотите. Вам придется проанализировать ответ JSON и отобразить информацию, манипулируя элементами страницы (возможно, используя JQUERY, так как вы, кажется, уже используете это). Вариант № 2 вместо передачи отфильтрованного набора запросов обратно клиенту, вы можете передать его в свой шаблон и сгенерировать еще немного HTML с меньшим подмножеством информации. Тогда, может быть, вы передаете это обратно клиенту. Вы все равно должны были бы стереть существующие элементы страницы и заменить их новым HTML, используя JavaScript. Как вы можете видеть, этот материал AJAX становится довольно сложным, и вы действительно делаете это, только когда нет смысла перезагружать страницу.
  2. Если вы намеревались перезагрузить всю страницу, однако ...
    • Это была бы хорошая возможность начать изучать формы Джанго. Вы не только сможете использовать свой шаблон так, как хотите, отправка форм является очень важной частью Django. Вместо вашей кнопки #send, выполняющей какой-либо AJAX-запрос, вы можете сделать ее кнопкой отправки формы (форма запроса GET). Отправка этой формы и указание на тот же URL-адрес приведет к загрузке новой страницы. Уловка здесь в том, что ваша форма также отправит некоторые дополнительные данные вместе с GET-запросом, который мы можем прочитать в представлении. После получения запроса GET ваше представление может попытаться прочитать содержимое этого запроса. Если ничего нет, вы можете по умолчанию показать все (я полагаю, это то, что вы делаете сейчас), но если в запросе что-то есть, вы можете прочитать его и использовать эту информацию для фильтрации набора запросов, отправляемого в шаблон. , В конечном итоге вы будете использовать тот же шаблон, но он будет отображать больше или меньше информации на основе набора запросов, предоставленного ему представлением.
...