Не удается продвинуть Django paginator после отправки формы - PullRequest
0 голосов
/ 06 октября 2018

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

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

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

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

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

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%}

1 Ответ

0 голосов
/ 07 октября 2018

Ответ (или и ответ) оказался перенаправлением сразу после сохранения / POST.При сохранении записи Link удаляется место из очереди, поэтому страница всегда имеет значение «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)

...

...