3

我已经让基于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)  

另外,我知道表单向导,但我没有多页表单。即使我忽略了这一点,表单向导也不会在最终保存之前提供预览数据的机会。

编辑:关于谷歌群组的相关讨论,但没有解决方案

4

1 回答 1

6

这是我应该做的:

覆盖 RestaurantCreate 类的 form_valid 方法,让表单保存在会话中。从那里您可以重定向到另一个视图,即您的 RestaurentDetail 视图,在那里您可以通过从会话中读出表单并显示您需要的内容来覆盖 get_object 方法。在那里我还会放置一个隐藏所有字段的表单,除了提交/保存按钮。该表单将由您会话中的任何内容填充。因此,当用户按下保存时,例如对另一个视图 RestaurantFinalCreate 视图执行 POST。在那里你可以像往常一样实现 CreateView。

如果您不确定要覆盖哪种方法以及如何覆盖,请查看:http ://ccbv.co.uk/它对我很有帮助。

也不要在 RestaurantCreate 视图的 form_valid 方法中使用 super,因为这会触发父类 ModelFormMixin 中的保存。

于 2012-09-17T06:49:53.827 回答