Как загрузить Django ListView через Ajax - PullRequest
0 голосов
/ 26 марта 2019

В основном код работает, как я и ожидал, но мой ListView не обновляется.Все работает нормально, но шаблон не загружается сам, я должен нажать кнопку перезагрузки (тогда все данные загружаются правильно).

Я сделал простую форму / ввод для тестирования и нет проблем с представлениями.Мой проект требует наличия виджета календаря для выбора месяцев, и я нашел самый простой способ сделать это в Интернете: Ajax-подход.

Функция Ajax:

$(document).ready(function () {
            $(function () {
                $("#datetimepicker1").datetimepicker({

                        viewMode: 'months',
                        format: 'MM/YYYY',
                }).on('dp.change', function (e) {
                    var url = "/booking/update_months/{{hotel_id}}";
                    $.ajax({
                        type: 'GET',
                        url: url,
                        dataType: 'json',
                        data: {
                            month: e.date.month(),
                        },
                        success: function (data) {
                        },
                        error: function (data) {
                        }
                    });
                })

            });
        });

Url "/ booking / update_months / {{hotel_id}} "относится к первой функции просмотра, которую я использую для этой функции:

@csrf_exempt
def update_months(request, hotel_id):
    if request.GET.get('month'):
        month = request.GET.get('month')
        request.session['month'] = int(month) + 1
        return HttpResponseRedirect(reverse('booking:hotel_statistics', args=(hotel_id,)))
    else:
        return render_to_response(request, 'booking/hotel_statistics.html')

Затем в HotelStatistics ListView я делаю некоторые вещи в функции get_context_data, здесь ничего особенного.Просто несколькими «отпечатками» я проверил, что код выполняется до конца класса.

class HotelStatistics(ListView):
    model = Reservation
    context_object_name = 'reservations'
    template_name = 'booking/hotel_statistics.html'

    def get_context_data(self, **kwargs):
    .
    .
    .
    return context

Я почти уверен, что что-то упустил с функциональностью Ajax, это мой первыйподход к этому языку.Заранее благодарим за помощь.

1 Ответ

0 голосов
/ 26 марта 2019

Почему вы используете AJAX здесь? Если я что-то не упустил, вам просто нужно иметь указатель даты в отправляемой форме HTTP GET.

template.html

<!-- The action attribute hardcoded URL value should be replaced with a Django url templatetag. This will allow the url to be resolved based on the router configuration. i.e. {% url "booking:update_months" hotel_id %} --> 
<form action="/booking/update_months/{{ hotel_id }}" method="GET">
  <input id="date" name="date">
  <button type="submit">Update</button>
</form>

<script>
$(document).ready(function() {
  $("#date").datetimepicker({
    viewMode: 'months',
    format: 'yyyy-mm-dd',
  });
});
</script>

view.py

@csrf_exempt
def update_months(request, hotel_id):
  date = request.GET.get("date")

  if date:
    request.session["month"] = datetime.strptime(date, "%Y-%m-%d").month
    return redirect("booking:hotel_statistics", False, hotel_id)

  return render(request, "booking/hotel_statistics.html")

Приведенный выше код отправляет форму HTTP GET, что приводит к серверной стороне 301 и, следовательно, к «обновлению» вашей страницы статистики обновлением данных сеанса.

Обратите внимание, мы отправляем полную информацию о дате. Я не уверен, что вы делаете это по отдельности, но если вы разрешаете пользователям обновлять каждую часть даты независимо, теперь вы можете объединить это в одну update_date функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...