[**找到了解决方法,请参见下文**]
我无法让Django 2 Paginator与modelformset一起使用。共有三种模型,“放置并命中”(一对多)和“链接”。 “验证器”视图一次遍历Place对象1的页面,构建由FK占位符过滤的命中查询集。发送到模板的上下文包括1)formset = HitFormSet,2)仅包含一个Place对象的“记录”列表,以及3)Paginator页面。
模板在左侧呈现单个Place记录,在右侧呈现Hit表单的滚动列表。 “命中”表单添加了两个字段:“匹配”(3个单选按钮)和“标志”(复选框)。如果一个或多个匹配项与位置匹配,则用户选择匹配项。提交后,将创建一个新的Link记录,其中包含一个Placeid,一个Hitid以及单选框和复选框中的值。另外,“位置”记录中的“已审核”字段设置为“真”。
以下代码可加载位置#1,然后在记录中进行分页-显示位置及其命中数。单击保存按钮将根据需要创建一个新的链接记录。问题是保存后,尽管下一页在左侧加载,但其对应的匹配项却没有。通过显示pprint(locals()),我可以看到正确的命中在查询集中,但是表单集中的“命中”字段都保留了前一组表单中的值。分页器正在前进,并且将加载下一个位置,但不会加载其“命中”表单集。
我已经猛撞了几天,阅读了文档,进行了搜索等。有什么想法吗?
view.py
r
template.html
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)
答案 0 :(得分:0)
答案(或 an 答案)原来是在保存/发布后立即进行了重定向。链接记录的保存将队列中的位置删除,因此页面始终为“ 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)
...