web-dev-qa-db-de.com

AttributeError: module Django.contrib.auth.views hat kein Attribut

In meinen Django App-Benutzerkonten habe ich ein Anmeldeformular und ein Modell für meine Anmeldung erstellt. Bei der Ausführung von python verwalten. Bei Makemigrationen tritt der Fehler auf: AttributeError: module Django.contrib.auth.views hat kein Attribut 'registration' Zweitens: Codiere ich die SignUpForm in forms.py korrekt? Ich wollte das Benutzermodell aus folgenden Gründen nicht in Modellen verwenden Es würde einen Benutzernamen anfordern und ich wollte nicht, dass meine Website nach einem Benutzernamen fragt.

Hier ist mein 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

Öffne urls.py und ersetzen:

Django.contrib.auth.views.login mit Django.contrib.auth.views.LoginView

Django.contrib.auth.views.logout mit Django.contrib.auth.views.LogoutView

30
Mehmet Guloglu

Deine rlpatterns sollten sein:

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

In Django Version 2.1 in benutzerdefinierten URL-Mustern aus der Auth-App, die ich verwende

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

Sie benötigen LoginView usw. als Klasse und keine Funktion, wie hier (neu in Django 1.11 als Should und ein Muss ab Version 2.1)

5
Timo

Öffnen Sie die url.py-Datei und ersetzen Sie sie

views.login with views.LoginView

3
prosper1

es sollte sein:

url(r'^registration/$', views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'),

auth_views hat keine Registrierung, Ihre Ansichten jedoch

3
realmbit

Die Ansichten von Django 2.1 ändern sich von Funktionsansicht zu Klassenansicht, und der Name ändert sich auch, sodass Sie in einem vergessenen Prozess einen anderen Ansichtsnamen eingeben müssen

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 können Sie das Benutzermodell anpassen und Sie können den Benutzernamen entfernen und die E-Mail-Adresse verwenden

models.py

benutzermodell, das Sie schreiben können, passen Sie Spalte an, die Sie hinzufügen und Sie können löschen

benutzerverwaltung auch sie können comond wie superbenutzer anpassen, wenn sie einen voreingestellten wert angeben müssen

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

einstellungen, die Sie benötigen, um Ihr benutzerdefiniertes Benutzermodell anzugeben

# AUTH USER MODEL
AUTH_USER_MODEL = "Accounts.User" 

LOGIN_URL = '/login/'
#LOGIN_REDIRECT_URL  = 'login_success'

LOGOUT_REDIRECT_URL = '/login/'

admin.py

admin müssen Sie Benutzermodell registrieren

## 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

Sehr einfache Schritte:

Gehe zu den Projekten urls.py

ändere "views.login" in "views.LoginView.as_view ()"

wenn Sie Logout atribute verwenden, machen Sie dasselbe damit

2
Suraj Verma

Öffne urls.py und ersetze:

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

1
HoangYell

Da ich keine Kommentare hinterlassen kann, habe ich beschlossen, eine Antwort zu hinterlassen. In der Nähe des else-Blocks befindet sich ein zusätzlicher Einzug. Ihre Registrierungsfunktion sollte wie folgt aussehen:

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})

Aus diesem Grund wird dieser Fehler angezeigt

Die Ansicht useraccounts.views.registration hat kein HttpResponse-Objekt zurückgegeben. Stattdessen wurde None zurückgegeben.

1
Roman Kozinets

Sie müssen die LoginView in Ihre urls.py importieren:

from Django.contrib.auth.views import LoginView

und ändern

auth_view.login

zu

LoginView.as_view()
0
Daniel