我已经获得Creatview()基于类的功能。提交成功后,它已经有数据并显示“成功”页面。
我想以这种方式改变这种行为:当CreateView()成功时,我希望数据得到验证,但不能保存。我不想进入成功页面,而是想使用DetailView()类来显示新创建的实例,这样用户就可以看到最终保存数据时的样子了。
一旦用户对所显示的数据感到满意,用户可以点击“保存”,在这种情况下保存数据并完成CreateView(),或者用户可以点击“重新编辑”,然后返回到用于更改数据的表单,然后使用DetailView()显示新创建的实例(并重复直到用户满意为止)。优雅使用基于类的视图的最佳方法是什么?
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)
另外,我知道表单向导,但我没有多页表单。即使我忽略了这一点,表单向导也没有机会在最终保存之前预览数据。
编辑:关于google groups的相关讨论,但没有解决方案
答案 0 :(得分:5)
这是我应该做的:
覆盖RestaurantCreate类的form_valid方法,并将表单保存在会话中。从那里你可以重定向到另一个视图,你的RestaurentDetail视图,在那里你将通过从会话中读出表格并显示你需要的内容来覆盖get_object方法。 在那里我还会放置一个隐藏所有字段的表单,除了提交/保存按钮。表单将由您会话中的任何内容填充。因此,当用户按下保存时,例如,对另一个视图的RestaurantFinalCreate视图执行POST。在那里你可以正常实现CreateView。
如果您不确定要覆盖哪种方法以及如何覆盖,请查看:http://ccbv.co.uk/它对我非常有用。
也不要在RestaurantCreate视图的form_valid方法中使用super,因为这会触发父类ModelFormMixin中的保存。