Django-将POST数据从一个视图传递到另一个视图以及表单验证中的错误。

Django-将POST数据从一个视图传递到另一个视图以及表单验证中的错误。,django,validation,post,django-forms,django-views,Django,Validation,Post,Django Forms,Django Views,我正在更改帐户的密码。我正在从第一个视图获取用户名和密码,并在第二个视图上传递它。它可以正常工作,但当涉及到第二个视图表单验证时。它会错误地重定向到第一个视图的窗体。那是我的问题 我的目标是,如果第二次身份验证失败,则丢弃数据(用户名和密码)不要更改密码。还有一件事我不希望用户通过get请求访问第二个视图 def first_view(request): if request.method == 'POST': form=firstForm(request.POST) # for gett

我正在更改帐户的密码。我正在从第一个视图获取用户名和密码,并在第二个视图上传递它。它可以正常工作,但当涉及到第二个视图表单验证时。它会错误地重定向到第一个视图的窗体。那是我的问题

我的目标是,如果第二次身份验证失败,则丢弃数据(用户名和密码)不要更改密码。还有一件事我不希望用户通过get请求访问第二个视图

def first_view(request):
 if request.method == 'POST':
  form=firstForm(request.POST) # for getting username password
  if form.is_valid():
   return second_view(request) # Don't want HttpResponse here. To send POST request.
   #Sending username and password data in POST request.
 else:
  form=firstForm()
 return render(request,'template1.html',{'form':form})
这是通过在手机上发送文本代码进行的第二次身份验证

def second_view(request):
 if request.method === 'POST':
  form=secondForm(request.POST) # Single field - Code recieved on phone 
  username=request.POST['username']
  password=request.POST['password']
  code=GetRandomNumber() # Creates a random number to send on phone. 
  SendText(code,numer) # Sends code on number
  if form.is_valid(): # HERE IT REDIRECTS TO THE FIRST VIEW FORM WITH ERROR
   if code==request.POST['code']:
    HttpResponse('Succeess') 
  else:
   HttpResponse('Not allowed')  

在这种情况下,我建议您使用django会话。例如:

第一视图

  • 发布时,在first_视图中检查FirstForm中的用户名/密码
  • 如果凭据正常--在会话中保存一些状态
  • 向用户发送代码
  • 重定向到第二个视图
  • Secod视图

  • 检查会话中以前保存的状态
  • 发布时在第二个视图中检查第二个表单中的代码
  • 如果代码正常——成功
    类似于此。

    您的解决方案是正确的,用户将通过身份验证。执行上述代码的原因是步骤4是一个重定向,即GET请求。如果用户点击第二个视图url,我不想弹出第二个视图。这将是一个毫无意义的窗口。在这种情况下,我不能像@login\u required那样使用decorator。如果第二个视图不是由第一个视图启动的,是否有任何方法可以阻止用户访问第二个视图?请注意第(2)点和第(5)点。第(2)点——您只需在会话中保存一个标志
    请求。会话['first\u view\u ok']=True
    (例如,您还可以在会话中保存用户名/user\u pk/etc),指示用户正确通过了(1)点。不进行身份验证——只存储一个标志。至于(5)——您应该检查request.session['first\u view\u ok']==True是否转到(6),否则将引发错误“需要在FirstView中进行身份验证!”。