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()はなにをしているのかを説明

関数定義

github.com

ここでは、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()を使っている。

参考にさせていただきました。

qiita.com