属性错误:模块Django.contrib.auth.views没有属性。

44

在我的Django应用程序“useraccounts”中,我创建了一个注册表单和一个注册模型。然而,在运行python manage.py makemigrations时,遇到了错误: AttributeError: module Django.contrib.auth.views has no attribute 'registration'。其次,我在forms.py中正确地编写了SignUpForm吗? 我不想在模型中使用User模型,因为它会要求用户名,而我不想让我的网站请求用户名。

这是我的代码:

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

表单.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', )

视图函数文件

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

]

请发布完整的错误回溯信息。 - rollinger
原来我弄错了 registration 部分的 url.py。虽然谢谢你的回答! - TheCoxer
始终写出Django版本,因为版本之间有很多开发工作。 - Timo
11个回答

67

打开urls.py文件,将以下内容替换:

django.contrib.auth.views.login 替换为 django.contrib.auth.views.LoginView

django.contrib.auth.views.logout 替换为 django.contrib.auth.views.LogoutView


28

您的URL模式应该是:

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

19
在Django 2.1版本中,我使用来自auth应用程序的自定义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'),
]

8

Django 2.1贡献视图已经从函数视图更改为类视图,名称也更改了,因此在忘记密码流程中您需要提供其他视图名称。

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可以自定义用户模型,您可以删除用户名并使用电子邮件地址

models.py

用户模型中,您可以编写自定义列,可以添加和删除

用户管理也可以自定义命令,例如超级用户,如果需要给任何默认值

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)

设置.py

这是你需要提供自定义用户模型的设置。

# AUTH USER MODEL
AUTH_USER_MODEL = "Accounts.User" 

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

LOGOUT_REDIRECT_URL = '/login/'

admin.py

在 admin.py 文件中,您需要注册用户模型。

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

7

您需要在urls.py中导入LoginView:

from django.contrib.auth.views import LoginView

并进行更改

auth_view.login

to

LoginView.as_view()

5

你需要将LoginView等视为类而不是函数,如此处所示(自Django 1.11开始作为应该,从2.1版本开始则为必须)


5

非常简单的步骤:

进入项目中的 urls.py,将 views.login 更改为 views.LoginView.as_view()

如果您正在使用注销属性,则对其执行相同操作


3

应该是:

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

auth_views没有注册功能,你的views有


谢谢。但是现在当我打开 useraccounts/registration.html 时,我收到错误消息:“视图 useraccounts.views.registration 没有返回 HttpResponse 对象。它返回了 None。”另外,我的表单和视图是否正确? - TheCoxer

3

打开url.py文件并将

views.login替换为views.LoginView


你是否能提供更多上下文来使你的回答更加合适?例如,你会用到什么样的代码?由于你要用类替换函数,所以语法可能不一样。另外,你需要提醒这只适用于Django>=1.11版本。 - Christopher Pearson
当我从Django 2的某个版本升级到2.2.3时,遇到了这个错误。我已经修复了我的URL,如下所示: url(r'^accounts/login/$', django.contrib.auth.views.LoginView,name="login"), url(r'^accounts/logout/$', django.contrib.auth.views.LogoutView,{'next_page': '/'},name="logout"), - Eino Mäkitalo

2

我无法留下评论,所以我决定留下答案。 您的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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接