提交表单集后无法推进Django Paginator

时间:2018-10-06 04:41:52

标签: django django-forms paginator

[**找到了解决方法,请参见下文**]

我无法让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)

1 个答案:

答案 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)

...