Dans mes Django app useraccounts, j'ai créé un formulaire d'inscription et un modèle pour mon inscription. Cependant, lorsque je suis allé exécuter python, gérer. py makemigrations, je rencontre l'erreur AttributeError: module Django.contrib.auth.views n'a pas d'attribut 'registration'. Deuxièmement, je code correctement le SignUpForm dans forms.py? Je ne voulais pas utiliser le modèle User dans les modèles car il demanderait un nom d'utilisateur et je ne voulais pas que mon site Web me demande un nom d'utilisateur.
Voici mon code:
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'),
]
Ouvert urls.py
et remplacer:
Django.contrib.auth.views.login
avec Django.contrib.auth.views.LoginView
Django.contrib.auth.views.logout
avec Django.contrib.auth.views.LogoutView
Votre rlpatterns devrait être:
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"),
]
Dans Django version 2.1 dans des modèles d'urls personnalisés de l'application auth que j'utilise
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'),
]
Vous avez besoin de LoginView
, etc. comme classe et non comme une fonction ici (nouveauté Django 1.11 en tant que Should
et un must à partir de la version 2.1)
Ouvrez le fichier url.py et remplacez
views.login avec views.LoginView
cA devrait etre:
url(r'^registration/$', views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'),
auth_views n'a pas d'enregistrement, votre vue a
Les vues contrib sur Django 2.1 changent de vue de fonction à vue de classe et le nom change aussi, donc, dans le processus oublié, vous devez donner un autre nom de vue.
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 vous pouvez personnaliser le modèle d'utilisateur et vous pouvez supprimer le nom d'utilisateur et utiliser l'adresse e-mail
modèle utilisateur, vous pouvez écrire personnaliser la colonne, vous pouvez ajouter et vous pouvez supprimer
utilisateur gérer aussi vous pouvez personnaliser comond comme super utilisateur si vous avez besoin de donner une valeur par défaut
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)
paramètres que vous devez donner à votre modèle d'utilisateur personnalisé
# AUTH USER MODEL
AUTH_USER_MODEL = "Accounts.User"
LOGIN_URL = '/login/'
#LOGIN_REDIRECT_URL = 'login_success'
LOGOUT_REDIRECT_URL = '/login/'
administrateur vous devez enregistrer le modèle d'utilisateur
## 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',)
Étapes très simples:
Allez aux projets urls.py
remplacez "views.login" par "views.LoginView.as_view ()"
si vous utilisez une déconnexion, faites de même avec
Ouvrez urls.py et remplacez:
change views.login => views.LoginView.as_view ()
Je ne peux pas laisser de commentaires alors j'ai décidé de laisser une réponse. Vous avez un retrait supplémentaire près du bloc else. Votre fonction d'enregistrement devrait ressembler à:
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})
C'est pourquoi vous obtenez cette erreur
La vue useraccounts.views.registration n'a pas renvoyé d'objet HttpResponse. Il a renvoyé None à la place.
Vous devez importer le LoginView dans votre urls.py:
from Django.contrib.auth.views import LoginView
et changer
auth_view.login
à
LoginView.as_view()