2011-08-31 10 views
2

非常に簡単な変更を加える必要があります - ユーザーが認証されていないときに特定のビューのみが表示されるようにする必要があります。たとえば、私がログインしている場合、ユーザーが/ registerページに再びアクセスできるようにしたくありません。django-registrationでカスタマイズされたビュー

だから、私はregisterのビューをdjango-registrationからサブクラス化したいと考えていると思います。これは私が進める方法がわからないところです。これは正しい方向ですか?ここでユーザーの認証ステータスをテストする必要がありますか?ヒントとアドバイスを歓迎!

編集

私は、これはここに右のトラックだと思う:Django: Redirect logged in users from login page

編集2

ソリューション:

custom_registration、例えば、別のアプリを作成し、書き込みこのようなビュー(私のカスタムフォームも使用します):

from registration.views import register 
from custom_registration.forms import EduRegistrationForm 

def register_test(request, success_url=None, 
      form_class=EduRegistrationForm, profile_callback=None, 
      template_name='registration/registration_form.html', 
      extra_context=None): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/') 
    else: 
     return register(request, success_url, form_class, profile_callback, template_name, extra_context) 

私は同じ関数のパラメータを使用しなければなりませんでしたが、それ以外の場合はテストだけを含めて渡した場合はmain関数に進みます。

(再び、これは同様に私のカスタムフォームに関するいくつかのものが含まれます)のいずれかURLconfを使っでこれを置くことを忘れないでください:

トップレベルのURLconf

(r'^accounts/', include('custom_registration.urls')), 
(r'^accounts/', include('registration.urls')), 

custom_registration.views

from django.conf.urls.defaults import * 
from custom_registration.views import register_test 
from custom_registration.forms import EduRegistrationForm 

urlpatterns = patterns('', 
    url(r'^register/$', register_test, {'form_class': EduRegistrationForm}, name='registration.views.register'), 
) 

答えて

5

私が覚えている限り、django登録は関数ベースのビューを使用しているので、実際にサブクラス化することはできません。私が通常従うアプローチは、元のビューを "上書き"することです(もちろん、ジャンゴ登録アプリケーションを変更する必要はありません)。

  1. 別のアプリを作成します(あなたがそれcustom_registrationまたは何でもしたい呼び出すことができます)
  2. このアプリは、別のurls.pyとあなたのケースでは、別のviews.py
  3. コピー元registerビューのコードが含まれている必要があります。これは、このように動作します新しいviews.pyにして、それを修正し、このビューを指すようにurls.pyにパターンを追加します(このビューのジャンゴ登録と同じURLパターンを使用)
  4. includeあなたのurls.pyプロジェクトにを入れて新しいアプリurls.pyの前に元のdjango登録アプリが含まれています。これは、例えば次のようになります。
urlpatterns = patterns('', 
    ... 
    url(r'^accounts/', include('custom_registration.urls')), 
    url(r'^accounts/', include('registration.backends.default.urls')), 
    ... 
) 

これは単に/accounts/registerのため、最初に一致したURLパターンがあなたの新しいアプリを指すようになりますので、動作しますので、それから1を呼び出そうとすることはありません元のアプリ。

+0

私はこれまでに私の編集ごとにこれを行っていましたが、私はあなたにそれをあげます。そのリンクをチェックすると、彼が他の関数の周りに関数をどのようにラップするのかがわかります。テストに合格すると、実際の関数にまで下がります。私は 'register'にあるテスト関数の中で同じパラメータを使わなければなりませんでしたが、そうでないとうまくいきました。それを超えてコードを複製する必要はありません。コードの2回目の編集を確認してください。 –

+0

もちろん、ビュー内で元のビューを呼び出してその応答を返すこともできます。実際に私はずっと同じことをしています。私はここで言及していないが、それを簡単に保つために。 –

+1

最新かつ最高の、この答えは現在時代遅れです!ビューは今すぐサブクラス化できます。 [django docs](https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/)および[django-registration docs](https://django-registration.readthedocs)を参照してください。 .org/ja/latest/views.html) –

関連する問題