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)  

また、フォーム ウィザードについては知っていますが、複数ページのフォームはありません。それを無視しても、フォームウィザードは最終保存前にデータをプレビューする機会を与えません.

編集:Googleグループに関する関連する議論、しかし解決策はありません

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 に答える