web-dev-qa-db-fra.com

AttributeError: le module Django.contrib.auth.views n'a aucun attribut

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'),

]
24
TheCoxer

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

30
Mehmet Guloglu

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"),
]
17
ozcanyarimdunya

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'),
]
8

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)

5
Timo

Ouvrez le fichier url.py et remplacez

views.login avec views.LoginView

3
prosper1

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

3
realmbit

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.

urls.py

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

models.py

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)

settings.py

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/'

admin.py

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',)
2
Maulik Harkhani

É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

2
Suraj Verma

Ouvrez urls.py et remplacez:

change views.login => views.LoginView.as_view ()

1
HoangYell

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.

1
Roman Kozinets

Vous devez importer le LoginView dans votre urls.py:

from Django.contrib.auth.views import LoginView

et changer

auth_view.login

à

LoginView.as_view()
0
Daniel