Не удается продвинуть пагинатор Django после отправки набора форм

[** нашел исправление, см. ниже **]

Мне не удается заставить Django 2 Paginator работать с набором моделей. Есть три модели: Place & Hit (один ко многим) и Link. «Валидатор» просматривает страницы через объекты Place по 1 за раз, формирует набор запросов Hits, отфильтрованных с помощью placeid FK. Контекст, отправляемый в шаблон, включает 1) набор форм = HitFormSet, 2) список «записей» только с одним объектом Place и 3) страницу Paginator.

Шаблон отображает одну запись Place с левой стороны и прокручиваемый список форм Hit справа. Форма Hit имеет два добавленных поля: «совпадение» (3 переключателя) и «флаг» (флажок). Пользователь выбирает их, если одно или несколько совпадений соответствуют месту. После отправки создается новая запись Link с идентификатором места, идентификатором попадания, значениями из радио и флажком. Кроме того, в поле «Проверено» в записи места установлено значение «Истина».

Приведенный ниже код работает для загрузки места №1, а затем пролистывает записи, отображая место и его совпадения. Если щелкнуть кнопку «Сохранить», будет создана новая запись ссылки. Проблема в том, что после сохранения, хотя следующая страница загружается слева, соответствующие ей обращения не загружаются. Отображая pprint (locals ()), я могу видеть правильные совпадения в наборе запросов, но все поля Hit в наборе форм сохраняют значения из предыдущего набора форм. Пагинатор продвигается и загружается следующее место, но не его набор форм Hit.

Я занимался этим пару дней, читал документы, искал и т. д. Есть идеи?

view.py

def validator(request):
  record_list = Place.objects.order_by('placeid').filter(reviewed=False)
  paginator = Paginator(record_list, 1)
  page = request.GET.get('page')
  records = paginator.get_page(page)
  count = len(record_list)

  context = {
      'records': records,
      'page': page if request.method == 'GET' else str(int(page)-1)
  }
  placeid = records[0].placeid
  hitid = records[0].hitid
  q = Hit.objects.filter(placeid=placeid)

  HitFormset = modelformset_factory(
      Hit, fields = ['id','hitid', ],form=HitModelForm,extra=0)
  formset = HitFormset(request.POST or None, queryset=q)
  context['formset'] = formset

  if request.method == 'GET':
    method = request.method
    print('a GET')
  else:
    if formset.is_valid():
      print('formset is valid')
      for x in range(len(formset)):
        link = Link.objects.create(
            placeid = placeid,
            hitid = formset[x].cleaned_data['hitid'],
            match = formset[x].cleaned_data['match'],
            flag = formset[x].cleaned_data['flag'],
        )
        # flag Place record as reviewed
        matchee = get_object_or_404(Place, placeid = placeid)
        matchee.reviewed = True
        matchee.save()
    else:
      print('formset is NOT valid')
      print(formset.errors)
  pprint(locals())
  return render(request, 'validator/template.html', context=context)

template.html

{% block content %}
  <div class = "pagination">
    <span class = "step-links">
            ... all standard, works fine
    </span>
  </div>
    {% for record in records %}
      {% if records.has_next %}
          <!-- <form id = "form_related" method = "POST" action = "" > -->
          <form id = "form_related" method = "POST" action = "?page = {{ records.next_page_number }}" >
        {% else %}
          <form id = "form_related" method = "POST" action = "" >
      {% endif %}
      {% csrf_token %}
      {{ formset.management_form }}
      <input type = "hidden" name = "placeid" value = "{{ record.placeid }}" />
      {% for form in formset %}
          <div class = "row">
            <div class = "col-sm-4 id = "place-record">
                <!-- Place attributes -->
            </div>
            <div class = "col-sm-8" id = "hit-forms">
                <div id = "review">
                <span>{{ form.match }} flag: {{ form.flag_geom }}</span>
            </div>
                <div id = "hit">
               <!-- Hit attributes -->
            </div>        
            </div>
          </div>
        {% endfor %}
    {% endfor %}
{% endblock%}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
68
1

Ответы 1

Ответ (или ответ ан) оказался перенаправлением сразу после сохранения / POST. Сохранение записи ссылки удаляет место из очереди, поэтому страница всегда имеет значение «1».

view.py ...

if formset.is_valid():
            for x in range(len(formset)):
                link = Link.objects.create(
                    placeid = placeid,
                    tgnid = formset[x].cleaned_data['tgnid'],
                    match = formset[x].cleaned_data['match'],
                    flag_geom = formset[x].cleaned_data['flag_geom'],
                )
                matchee = get_object_or_404(Place, placeid = placeid)
                matchee.reviewed = True
                matchee.save()
            return redirect('/formset/?page='+page)
else:
    print('formset is NOT valid')
    print(formset.errors)

...

Другие вопросы по теме