Djangoアプリのユーザーアカウントで、サインアップ用のフォームとモデルを作成しました。ただし、python manage.py makemigrationsを実行しようとすると、次のエラーが発生します。AttributeError:module Django.contrib.auth.views has no attribute 'registration'。次に、forms.pyでSignUpFormを正しくコーディングしていますか?モデルでユーザーモデルを使用したくありませんでした。ユーザーモデルがユーザー名を要求し、自分のWebサイトがユーザー名を要求したくないためです。
ここに私のコードがあります:
models.py
from Django.db import models
from Django.db.models.signals import post_save
from Django.dispatch import receiver
from Django.contrib.auth.models import User
class UserProfile(models.Model):
first_name = models.CharField(max_length=150)
last_name = models.CharField(max_length=150)
email = models.EmailField(max_length=150)
birth_date = models.DateField()
password = models.CharField(max_length=150)
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
instance.profile.save()
forms.py
from Django.forms import forms
from Django.contrib.auth.models import User
from Django.contrib.auth.forms import UserCreationForm
from useraccounts.models import UserProfile
class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('first_name',
'last_name',
'email',
'password1',
'password2', )
views.py
from Django.shortcuts import render, redirect
from Django.contrib.auth import login, authenticate
from useraccounts.forms import SignUpForm
# Create your views here.
def home(request):
return render(request, 'useraccounts/home.html')
def login(request):
return render(request, 'useraccounts/login.html')
def registration(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
user.refresh_from_db()
user.profile.birth_date = form.cleaned_data.get('birth_date')
user.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(password=raw_password)
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'registration.html', {'form': form})
urls.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'),
]
urls.py
を開き、次を置き換えます。
Django.contrib.auth.views.login
with Django.contrib.auth.views.LoginView
Django.contrib.auth.views.logout
with Django.contrib.auth.views.LogoutView
rlpatternsは次のとおりです。
from Django.contrib.auth import views as auth_views
urlpatterns = [
url( r'^login/$',auth_views.LoginView.as_view(template_name="useraccounts/login.html"), name="login"),
]
Djangoバージョン2.1で、使用する認証アプリのカスタムURLパターンで
from Django.urls import path, re_path
from Django.contrib.auth import views as auth_views
from Django.conf import settings
from .views import register_view, activate
urlpatterns = [
# url(r'^$', HomeView.as_view(), name='home'),
re_path(r'^register/$', register_view, name='signup'),
re_path(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
activate, name='users_activate'),
re_path('login/', auth_views.LoginView, {
'template_name': "users/registration/login.html"},
name='login'),
re_path('logout/', auth_views.LogoutView,
{'next_page': settings.LOGIN_REDIRECT_URL}, name='logout'),
re_path(r'^password_reset/$', auth_views.PasswordResetView,
{'template_name': "users/registration/password_reset_form.html"},
name='password_reset'),
re_path(r'^password_reset/done/$', auth_views.PasswordResetDoneView,
{'template_name': "users/registration/password_reset_done.html"},
name='password_reset_done'),
re_path(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
auth_views.PasswordResetConfirmView,
{'template_name': "users/registration/password_reset_confirm.html"},
name='password_reset_confirm'),
re_path(r'^reset/done/$', auth_views.PasswordResetCompleteView,
{'template_name': "users/registration/password_reset_complete.html"},
name='password_reset_complete'),
]
LoginView
などはクラスとしてではなく、関数としてではなく here (Django 1.11でのShould
およびバージョン2.1以降のMustで必要)
Url.pyファイルを開いて置き換えます
views.LoginViewを使用したviews.login
そのはず:
url(r'^registration/$', views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'),
auth_viewsには登録がなく、ビューにはあります
Django 2.1のcontribビューは関数ビューからクラスビューに変更され、名前も変更されるため、忘れたプロセスでは他のビュー名を指定する必要があります
from Django.contrib.auth import views as auth_views
path('password_reset/', auth_views.PasswordResetView.as_view(), {'template_name':'registration/Reset_email.html'}, name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), {'template_name':'registration/Reset_Email_Sent.html'}, name='password_reset_done'),
re_path('reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/', auth_views.PasswordResetConfirmView.as_view(), {'template_name' : 'registration/Forgot_password.html'}, name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), {'template_name' : 'registration/Signin.html'}, name='password_reset_complete'),
Djangoでは、ユーザーモデルをカスタマイズでき、ユーザー名を削除してメールアドレスを使用できます。
作成できるユーザーモデル、追加および削除できるカスタマイズ列
ユーザー管理では、デフォルト値を指定する必要がある場合は、スーパーユーザーのようにcomondをカスタマイズできます。
from Django.contrib.auth.models import User
from Django.contrib.auth.models import AbstractUser,BaseUserManager
from Django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
"""Create and save a SuperUser with the given email and password."""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
class User(AbstractUser):
username = None
email = models.EmailField(_('email'), unique=True)
first_name = models.CharField( _('first name'), max_length=250)
last_name = models.CharField(_('last name'), max_length=250)
email_confirmed = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name',]
objects = UserManager()
def __str__(self):
return "%s" %(self.email)
カスタムユーザーモデルに必要な設定
# AUTH USER MODEL
AUTH_USER_MODEL = "Accounts.User"
LOGIN_URL = '/login/'
#LOGIN_REDIRECT_URL = 'login_success'
LOGOUT_REDIRECT_URL = '/login/'
ユーザーモデルを登録する必要がある管理者
## user model view
from Django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from Django.utils.translation import ugettext_lazy as _
@admin.register(User)
class UserAdmin(DjangoUserAdmin):
"""Define admin model for custom User model with no email field."""
fieldsets = (
(None, {'fields': ('email', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email_confirmed')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
'groups', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'password1', 'password2', 'first_name', 'last_name'),
}),
)
list_display = ('email', 'first_name', 'last_name',)
search_fields = ('email', 'first_name', 'last_name')
ordering = ('-id',)
非常に簡単な手順:
プロジェクトurls.pyに移動します
「views.login」を「views.LoginView.as_view()」に変更します
ログアウト属性を使用している場合は、同じことをします
Urls.pyを開いて置き換えます:
views.login => views.LoginView.as_view()を変更します
コメントを残すことができないので、答えを残すことにしました。 elseブロックの近くに追加のインデントがあります。登録関数は次のようになります。
def registration(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
user.refresh_from_db()
user.profile.birth_date = form.cleaned_data.get('birth_date')
user.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(password=raw_password)
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'registration.html', {'form': form})
これがこのエラーを受け取る理由です
ビューuseraccounts.views.registrationは、HttpResponseオブジェクトを返しませんでした。代わりにNoneを返しました。
LoginViewをurls.pyにインポートする必要があります。
from Django.contrib.auth.views import LoginView
そして変化
auth_view.login
に
LoginView.as_view()