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
AttributeError: module Django.contrib.auth.views has no attribute
提问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.py
and replace:
打开urls.py
并替换:
django.contrib.auth.views.login
with django.contrib.auth.views.LoginView
django.contrib.auth.views.login
和 django.contrib.auth.views.LoginView
django.contrib.auth.views.logout
with django.contrib.auth.views.LogoutView
django.contrib.auth.views.logout
和 django.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
回答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 。