AttributeError: module Django.contrib.auth.views has no attribute
AttributeErrorが出たときの対応
url.py
from django.conf.urls import url from . import views from django.contrib.auth import views as auth_views urlpatterns = [ url(r'^$', views.home), //ここが間違い url(r'^login/$', auth_views.login, {'template_name': 'useraccounts/login.html'}, name='login'), url(r'^logout/$', auth_views.logout, {'template_name': 'useraccounts/logout.html'}, name='logout'), url(r'^registration/$', auth_views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'), ]
解決法
from django.contrib.auth.views import LoginView
そして該当箇所を変更
url(r'^login/$', LoginView.as_view(), {'template_name': 'useraccounts/login.html'}, name='login'),
このas_view()はなにをしているのかを説明
関数定義
ここでは、requestを受けとり、dispachメソッドを返却している。
def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): raise AttributeError( "%s instance has no 'request' attribute. Did you override " "setup() and forget to call super()?" % cls.__name__ ) return self.dispatch(request, *args, **kwargs)
dispachメソッドは、リクエストメソッドを判定して、実装されていたら、それを実行する。
なので関数を返しているだけ。 そもそもとしてなぜこんなことをする必要があるかというと。 DjangoのViewは下記の3つの条件を満たさないといけないらしい。
- requestオブジェクトを(第一引数として)受け取る
- callableである
- responseオブジェクトを返す
再利用可能なように、クラスベースのビューに変更になったようです。
これを満足させるために、as_view()を使っている。
参考にさせていただきました。