2

django-registrationのデフォルトビューに非常に簡単な変更を加える必要があります(ユーザーが認証されていない場合にのみ特定のビューが表示されるようにする必要があります)。たとえば、ログインしている場合、ユーザーが/registerページに再度アクセスできないようにします。

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

編集

これはここで正しい道だと思います:Django:ログインしたユーザーをログインページからリダイレクトする

編集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)

同じ関数パラメーターを使用する必要がありましたが、それ以外の場合はテストを含めるだけで、合格した場合はメイン関数に進みます。

これを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'),
)
4

1 に答える 1

5

私が覚えている限り、django-registrationは関数ベースのビューを使用しているため、実際にそれらをサブクラス化することはできません。私が通常従うアプローチは、元のビューを「上書き」することです(もちろん、django-registrationアプリを変更することはありません)。これは次のように機能します。

  1. 別のアプリを作成します(custom_registrationまたは任意の名前を付けることができます)
  2. このアプリには別のアプリが含まれている必要がurls.pyあり、あなたの場合は別のアプリが含まれている必要がありますviews.py
  3. register元のビューコードを新しいものにコピーしてviews.py変更し、このビューを指すようにパターンを追加しますurls.py(このビューのdjango-registrationと同じURLパターンを使用します)
  4. 元のdjango-registrationアプリを含める前に、新しいアプリのincludeプロジェクトにを入れてください。これは、たとえば次のようになります。urls.pyurls.py
urlpatterns = patterns('', 
    ...
    url(r'^accounts/', include('custom_registration.urls')),
    url(r'^accounts/', include('registration.backends.default.urls')),
    ... 
)

の最初の一致するURLパターンが/accounts/register新しいアプリを指すため、これは単純に機能します。したがって、元のアプリからのURLパターンを呼び出そうとはしません。

于 2011-08-31T06:18:11.497 に答える