Django 2重定向到表单提交的下一页

时间:2018-08-07 05:06:59

标签: django pagination

我有一个Django 2应用,一次浏览一个大的“地方”记录,并且模板向每个添加了一些单选按钮集,用户可以在验证记录内容的过程中检查这些按钮集。我将每个记录包装成表格,提交后,我想a)在单独的“审阅”模型/表中从这些选择中创建一个新记录,并b)重定向到分页器的下一页。

我毫不费力地从表单单选输入创建新记录,然后重定向到确认页面。问题是如何重定向到相同的视图/模板但前进页面。

我尝试重定向到相同的视图,但URL不同:

path('place/', views.place, name='place'),
path('place/next', views.place, name='placenext'),

然后在视图中解析请求对象,但这将失败且没有错误:

def place(request):

  paginator = Paginator(place_list, 1)
  req = request.path
  page = request.GET.get('page')  

  if req[-4:] == 'next':
    records = paginator.get_page(str(int(page)+1))
  else:
    records = paginator.get_page(page)

  context = {
    'records': records, 'page': page
  }

  return render(request, 'review/place.html', context=context)

我还尝试了许多其他方法,包括以几种方式插入?page=,但是它在黑暗中摸索着,因为文档中没有指示如何完成此操作的指示。据我所知,请求对象中没有任何东西可以使我成为“双重目的”视图-只是呈现记录或推进页面。

[正确答案,归因于下面的@Satendra]

单路径,具有GET或POST的单个视图返回相同,但如果为POST,则创建具有表单内容的新记录。谢谢

if request.method == 'POST':
    # create Related record
    relform = request.POST
    related = Related.objects.create(
        placeid = relform['placeid'],
        ...,
        ...
    )
pprint(locals())
return render(request, 'review/place.html', context=context)

1 个答案:

答案 0 :(得分:2)

不要为同一视图创建多个端点。

  

只需添加请求方法检查,然后在 POST 方法中使用   redirect方法将其重定向到同一视图

from django.shortcuts import redirect, render

def place(request):
  if request.method == 'GET':
     ...
     # your code lies here when request is GET
     return render(request, 'review/place.html', context=context)
  else:
     return redirect('place')