13

Djangosクラスベースのジェネリックビューを使用してCRUDアプリケーションを作成しようとしています。以下は、データベースに新しいユーザーを作成するために作成したコードです。

  from django.views.generic import CreateView
  from django.contrib.auth.decorators import login_required
  from django.contrib import messages

  class UserCreateView(CreateView):
  """ 
  Display and accept a new user to be created in db
  """
    form_class = ProfileForm
    template_name = 'userdb/profile_form.html'
    success_url = '/organization/users/'

    def post(self, request, *args, **kwargs):
      messages.success(request, "Success", extra_tags='msg')
      return super(UserCreateView, self).post(request, *args, **kwargs)

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
      return super(UserCreateView, self).dispatch(*args, **kwargs)

ユーザーに表示する成功メッセージを追加するには、post機能を拡張する必要があることに注意してください。この関数が呼び出されたときに、送信されたフォームに有効なデータが含まれているかどうかが判断されないため、これは適切な方法ではないことを私は知っています。だから私の質問は、Djangosメッセージングフレームワークをクラスベースのジェネリックビューと組み合わせる推奨される方法はありますか?

4

1 に答える 1

16

答えは、メッセージングフレームワークで具体的に何をしようとしているのかによって異なります。リクエストごとに呼び出す必要がある場合getは、当然、getメソッドに配置する必要があります(このコードを配置する適切な場所が1つもないことを意味します)。

とにかく、フォームが有効な場合にのみトリガーされる場所を探しているようです。

CreateViewフォームの保存が成功した場合にのみ起動されるメソッドModelFormMixinを実装するを使用します。form_valid完全!

def form_valid(self, form):
    messages.success(self.request, "Success", extra_tags='msg')
    return super(UserCreateView, self).form_valid(form)  
    # ModelFormMixin will now save
    # FormMixin will now redirect to success_url()
    # override above behavior if you need to do something with the object
于 2011-06-21T06:23:13.633 に答える