[** нашел исправление, см. Ниже **]
У меня проблемы с настройкой 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%}