[** нашел исправление, см. ниже **]
Мне не удается заставить 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%}





Ответ (или ответ ан) оказался перенаправлением сразу после сохранения / 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)
...