【问题标题】:Django 2 Redirect to next page on form submitDjango 2重定向到表单提交的下一页
【发布时间】:2018-08-08 01:02:21
【问题描述】:

我有一个 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)

【问题讨论】:

    标签: django pagination


    【解决方案1】:

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

    只需添加请求方法检查,当方法为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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2018-07-21
      • 2012-11-25
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多