Python AttributeError: 模块 Django.contrib.auth.views 没有属性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/47065438/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 17:59:50  来源:igfitidea点击:

AttributeError: module Django.contrib.auth.views has no attribute

pythondjangodjango-modelsdjango-formsattributeerror

提问by TheCoxer

In my Django app useraccounts, I created a Sign-Up form and a model for my Sign-up. However, when I went to run python manage.py makemigrations, I encounter the error: AttributeError: module Django.contrib.auth.views has no attribute 'registration'. Secondly, am I coding the SignUpForm in forms.py correctly? I did not want to use the User model in models because it would request username and I didn't want my website to ask for a username.

在我的 Django 应用程序用户帐户中,我为我的注册创建了一个注册表单和一个模型。但是,当我去运行 python manage.py makemigrations 时,我遇到了错误:AttributeError: module Django.contrib.auth.views has no attribute 'registration'。其次,我是否正确编码了 forms.py 中的 SignUpForm?我不想在模型中使用 User 模型,因为它会请求用户名,而且我不希望我的网站请求用户名。

Here is my code:

这是我的代码:

models.py

模型.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

表格.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

视图.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

网址.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'),

]

回答by Mehmet Guloglu

Open urls.pyand replace:

打开urls.py并替换:

django.contrib.auth.views.loginwith django.contrib.auth.views.LoginView

django.contrib.auth.views.logindjango.contrib.auth.views.LoginView

django.contrib.auth.views.logoutwith django.contrib.auth.views.LogoutView

django.contrib.auth.views.logoutdjango.contrib.auth.views.LogoutView

回答by ozcanyarimdunya

Your urlpatternsshould be:

你的urlpatterns应该是:

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

回答by Dimitris Kougioumtzis

In django version 2.1 in custom urls patterns from auth app i use

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

回答by Timo

You need LoginView, etc. as a class and not a function as seen here(new in Django 1.11 as Shouldand a Must from Version 2.1 on)

您需要LoginView, etc. 作为一个类而不是这里看到的函数(Django 1.11 中的新功能Should以及 2.1 版中的必须)

回答by Maulik Harkhani

Django 2.1 contrib views change from function view to class view and name also change so in forgot process you need to give other view name

Django 2.1 contrib 视图从函数视图更改为类视图并且名称也更改,因此在忘记过程中您需要提供其他视图名称

urls.py

网址.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 you can customize user model and you can remove username and use email address

Django 您可以自定义用户模型,您可以删除用户名并使用电子邮件地址

models.py

模型.py

user model you can write customize column you can add and you can delete

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

user manage also you can customize comond like super user if yo u need to give any default value

用户管理如果您需要提供任何默认值,您也可以像超级用户一样自定义 comond

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

设置.py

settings you need to give your custom user model

您需要提供自定义用户模型的设置

# AUTH USER MODEL
AUTH_USER_MODEL = "Accounts.User" 

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

LOGOUT_REDIRECT_URL = '/login/'

admin.py

管理文件

admin you need to register user model

admin 您需要注册用户模型

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

回答by Daniel

You have to import the LoginView in your urls.py:

您必须在 urls.py 中导入 LoginView:

from django.contrib.auth.views import LoginView

and change

和改变

auth_view.login

to

LoginView.as_view()

回答by prosper1

Open url.py file and replace

打开 url.py 文件并替换

views.login with views.LoginView

views.login 和 views.LoginView

回答by realmbit

it should be:

它应该是:

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

auth_views does not have registration, your views does

auth_views 没有注册,你的意见有

回答by Suraj Verma

Very Simple Steps:

非常简单的步骤:

Goto the Projects urls.py

转到项目 urls.py

change "views.login" to " views.LoginView.as_view()"

将“views.login”更改为“views.LoginView.as_view()”

if you are using Logout atribute then do the same with that

如果您使用的是 Logout 属性,请执行相同的操作

回答by Roman Kozinets

I can't leave comments so I decided to leave an answer. You have extra indent near else block. Your registration func should look like:

我不能发表评论,所以我决定留下答案。在 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})

This is why you get this error

这就是您收到此错误的原因

The view useraccounts.views.registration didn't return an HttpResponse object. It returned None instead.

视图 useraccounts.views.registration 没有返回 HttpResponse 对象。它返回 None 。