title: Django - Form across multiple views with progress saving
body: <p>I'm working on a Django project and to make the forms experience far smoother I want to spread a ModelForm across a few pages. It would be ideal if users who are logged in can save their progress in the form without actually posting the content (in this case, a <code>JobApplication</code> where users can come back to filling in info without actually sending off the application).</p>
  
  <p>Currently I have looked at other answers on SO such as <a href="https://stackoverflow.com/questions/14901680/how-to-do-a-multi-step-form-in-django">this one</a>; but this only shows me how to utilise caching to store information between the views where the form is present.</p>
  
  <p>Models.py (models, forms and views have been simplified for readability):</p>
  
  <pre><code>class JobApplication(models.Model):
      job = models.ForeignKey(JobPost,on_delete=models.SET_NULL,...)
      user = models.ForeignKey(AUTH_USER_MODEL,...)
      details = models.CharField(max_length=300)
      skills = models.CharField(max_length=300)
      feedback = models.CharField(max_length=300)
      #... [insert more fields] ...
  </code></pre>
  
  <p>Forms.py:</p>
  
  <pre><code>class Application(forms.ModelForm):
      details = forms.CharField() # To go in page 1 of the form process
      skills = forms.CharField() # To go in page 2
      feedback = forms.CharField() # To go in page 3
      class Meta:
          model = JobApplication
          fields = ['details','skills','feedback']
  </code></pre>
  
  <p>Views.py:</p>
  
  <pre><code>from . import forms
  def view1(request):
      form = forms.Application()
      if request.method == 'POST':
          form = forms.Application(data=request.POST)
          ... some logic here which I am not sure of ...
      return render(request, 'view1.html', {})
  
  def view2(request):
      form = forms.Application()
      if request.method == 'POST':
          form = forms.Application(data=request.POST)
          ...
      return render(request, 'view2.html', {})
  
  def view3(request):
      form = forms.Application()
      if request.method == 'POST':
          form = forms.Application(data=request.POST)
          ...
      return render(request, 'view3.html', {})
  </code></pre>
  
  <p>Note that I'm happy to edit my forms or models to achieve this multi-page, save progress effect that you may see on job sites.</p>
  
  <p>Let me know if there's any more code I can add that will be useful, since I'm not too sure what else will be required.</p>
  
  <p>Thanks!</p>