Trewq
Trewq

Reputation: 3237

changing CreateView behavior to preview data before save in django

I have gotten Creatview() class based function to work. When the submit succeeds, it has already the data and shows the 'success' page.

I'd like to change this behavior this way: When the CreateView() succeeds, I'd like the data to get validated, but not saved. Instead of going to the success page, I'd like to use the DetailView() class to display the newly created instance, so the user can see how it is going to look like when the data is eventually saved..

Once the user is happy with the data displayed, the user can click "save" in which case the data is saved and the CreateView() is completed or the user can click "re-edit", and go back to the form to change the data and then be shown the newly created instance using DetailView() (and repeat until the user is satisfied). What is the best way to do this using class based views elegantly?

from django.views.generic.edit import CreateView  
from restaurant.models import Restaurant  
from restaurant.forms import RestaurantForm  
import uuid  

class RestaurantCreate(CreateView):  
   form_class = RestaurantForm  
   template_name = 'restaurant_form.html'  
   model = Restaurant  

   def form_valid(self, form):  
       form.instance.created_by = self.request.user  
       form.instance.life_id = str(uuid.uuid1())  
       return super(RestaurantCreate, self).form_valid(form)  

Also, I do know about Form wizard, but I do not have multiple page forms. Even if I ignore that, Form wizard's does not give the opportunity to preview data before the final save.

Edit: Related discussion on google groups, but no solutions

Upvotes: 3

Views: 2401

Answers (1)

Jonas Geiregat
Jonas Geiregat

Reputation: 5442

Here's what I should do:

Overwrite the form_valid method of the RestaurantCreate class and let the save the form in a session. From there you can redirect to another view , your RestaurentDetail view, there you would overwrite the get_object method by reading out the form out of the session and displaying what you need. There I would also place a form with all fields hidden, except the submit/save button. The form will be populated by whatever was in your session. So when the user presses save a POST is done to another view RestaurantFinalCreate view for example. There you can just implement the CreateView as normal.

If you're uncertain which method to overwrite and how, take a look at: http://ccbv.co.uk/ it has been really helpful to me.

Also don't use super in the form_valid method of the RestaurantCreate view since that would trigger a save in the parent class ModelFormMixin.

Upvotes: 6

Related Questions