我已经使用AbstractUser制作了一个自定义用户模型,删除了用户名并用电子邮件替换了它,并扩展了该模型,尝试创建超级用户,它可以工作,并且还通过注册表单创建了一些用户,登录了管理界面,工作正常,但是尝试为用户创建登录表单时失败
我尝试过,但是没有用
def LoginView(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request,user)
return redirect('accounts:login')
else:
form = AuthenticationForm()
return render(request,'accounts/login.html', {'form':form})
然后我尝试了
class LoginView(FormView):
form_class = AuthenticationForm
template_name = 'login.html'
def form_valid(self, form):
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user = authenticate(email=email, password=password)
# Check here if the user is an admin
if user is not None and user.is_active:
login(self.request, user)
return HttpResponseRedirect(self.success_url)
else:
return self.form_invalid(form)
很明显,我希望用户能够登录 我认为这篇文章中的代码格式错误。主要是我的错,因为我是这个平台的新手
答案 0 :(得分:0)
如果您可以发布错误消息,那么对于第一个错误消息将会有所帮助。表单,视图或登录功能可能有问题...
答案 1 :(得分:0)
我已经开发了几乎与您描述的设置相同的设置(我没有删除用户名字段,只是停止使用它)。如果您还没有看到它,请参阅https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#substituting-a-custom-user-model上的Django文档。
要正确运行,有一些重要的事情需要设置。
USERNAME_FIELD
应该设置为电子邮件字段的名称。AUTH_USER_MODEL
需要指向您的自定义用户模型。class MyUser(AbstractUser):
USERNAME_FIELD = 'email'
AUTH_USER_MODEL = 'customauth.MyUser'
由于您已经完全删除了用户名字段,因此可能需要将django.contrib.auth.forms.AuthenticationForm
和django.contrib.auth.views.LoginView
子类化,以免造成麻烦,但是Django应该很好地处理其他身份验证字段。
如果您确实需要对视图进行子类化,那么https://ccbv.co.uk/projects/Django/2.2/django.contrib.auth.views/LoginView/是查看 all 方法以查看发生了什么的好地方。
编辑-关于子类化的必要性
我所说的关于可能需要继承某些东西的说法受到https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#writing-a-manager-for-a-custom-user-model的影响。我不确定身份验证系统是否还有其他部分需要您自定义它们,因为您删除了用户名字段。
我已经阅读了Django身份验证系统的一些源代码。这是要遵循的路径。
当对Django的身份验证视图发出POST请求时,身份验证表单将得到验证。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/forms.py#L191
调用authenticate函数。这会遍历设置的后端,并尝试对每个后端进行身份验证。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/__init__.py#L62
Django的内置身份验证后端会使用自然键来获取用户。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/backends.py#L16
我们可以在基本管理器中看到,使用的自然键是由USERNAME_FIELD
命名的字段。 https://github.com/django/django/blob/2.2.2/django/contrib/auth/base_user.py#L43
如果该表格有效,则意味着该用户已通过正确的身份验证,然后登录该用户。https://github.com/django/django/blob/2.2.2/django/contrib/auth/views.py#L88
我的反应是,Django应该适合您的用例。您不需要编写后端。这是我的直觉告诉你必须编写的代码范围。
from django.contrib.auth import views as auth_views
from django.shortcuts import resolve_url
class LoginView(auth_views.LoginView):
template_name = 'accounts/login.html'
def get_success_url(self):
return resolve_url('accounts:login')