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'),
]
Ö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
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"),
]
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)
Öffnen Sie die url.py-Datei und ersetzen Sie sie
views.login with views.LoginView
es sollte sein:
url(r'^registration/$', views.registration, {'template_name': 'useraccounts/registration.html'}, name='registration'),
auth_views hat keine Registrierung, Ihre Ansichten jedoch
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
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
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)
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 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',)
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
Öffne urls.py und ersetze:
change views.login => views.LoginView.as_view ()
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.
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()