Python 为用户创建自定义登录名更改了“我的管理员”的登录名。如何预防?
我正在创建一个web应用程序,用户必须在其中注册自己并创建配置文件。我正在使用Django提供的“AbstractBaseUser”类,因为我想添加一些其他字段。现在,当用户登录时,我希望登录凭据是移动电话号码和密码。我为此创建了一个自定义身份验证函数,并将其注册到my settings.py中。问题是,这改变了登录到我的管理员坐,我想保持不变 我遵循了从本教程向用户添加自定义字段的教程 My models.py:Python 为用户创建自定义登录名更改了“我的管理员”的登录名。如何预防?,python,django,Python,Django,我正在创建一个web应用程序,用户必须在其中注册自己并创建配置文件。我正在使用Django提供的“AbstractBaseUser”类,因为我想添加一些其他字段。现在,当用户登录时,我希望登录凭据是移动电话号码和密码。我为此创建了一个自定义身份验证函数,并将其注册到my settings.py中。问题是,这改变了登录到我的管理员坐,我想保持不变 我遵循了从本教程向用户添加自定义字段的教程 My models.py: from django.db import models from django
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import UserManager
class userInfo(AbstractBaseUser):
email = models.EmailField('Email address', unique=True,)
Mobile = models.CharField(max_length=15, unique=True,)
Address = models.CharField(max_length=500)
Landmark = models.CharField(max_length=50)
Status = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'Mobile'
def __unicode__(self):
return self.get_username()
登录页面的views.py:
import datetime
from .forms import userInfoForm, LoginForm
from django.shortcuts import render, render_to_response
from .models import userInfo, orderHistory
from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext, loader
from django.contrib.auth import login as django_login, authenticate, logout as django_logoutdef Login(request):
"""
Log in view
"""
if request.method == 'POST':
form = LoginForm(data=request.POST)
print ("Step 1")
if form.is_valid():
print ("Step 2")
user = authenticate(Mobile=request.POST['username'], password=request.POST['password'])
print ("Step 3")
if user is None:
print("No valid user")
if user is not None:
print ("Step 3.10")
if user.is_active:
print ("Step 4")
django_login(request, user)
print ("Step 5")
return redirect('/i/Home')
else:
form = LoginForm()
return render_to_response('loginpage.html', {
'form': form,
}, context_instance=RequestContext(request))`
forms.py:
from django import forms
from .models import userInfo, orderHistory
from django.forms import ModelForm
class LoginForm(forms.Form):
"""
Login form
"""
Mobile = forms.CharField(widget=forms.TextInput)
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
fields = ['Mobile', 'password'] `
我创建的后端:
from django.conf import settings
from django.contrib.auth.models import check_passwor
from .models import userInfo
class EmailAuthBackend(object):
"""
A custom authentication backend. Allows users to log in using their email address.
"""
def authenticate(self, Mobile=None, password=None):
"""
Authentication method
"""
try:
user = userInfo.objects.get(Mobile=Mobile)
if user.check_password(password):
return user
except userInfo.DoesNotExist:
return None
def get_user(self, user_id):
try:
user = userInfo.objects.get(pk=user_id)
if user.is_active:
return user
return None
except userInfo.DoesNotExist:
return None
最后是我对settings.py所做的更改:
AUTH_USER_MODEL = 'Registration.userInfo'
AUTHENTICATION_BACKENDS = ['Registration.authBackend.EmailAuthBackend', ]
Django的默认后端是
('Django.contrib.auth.backends.modelbend',)
,这是Django管理员正在使用的。插入行时:
AUTHENTICATION_BACKENDS = ['Registration.authBackend.EmailAuthBackend', ]
您正在覆盖默认后端,而不是添加第二个后端选项。将该行更改为:
AUTHENTICATION_BACKENDS = (
'Registration.authBackend.EmailAuthBackend',
'django.contrib.auth.backends.ModelBackend',
)
您的应用程序应该选择第二个后端。您可能需要根据第一个后端是否成功的逻辑触发第二个后端,请参阅对或之类问题的回答。我认为我没有像您提到的那样导入AuthenticationForm。虽然我试着更改表单的名称。没用。对设置进行注释是有效的。我已经包括了上面所有的导入语句。@user3573203更改了我的答案,希望这有帮助。让我知道,如果这不是解决方案,因为我想了解如何更好地工作!嘿我已经包括了默认的后端,管理页面没有改变。当我创建超级用户时,它仍然要求“移动”。我还没有尝试应用一些逻辑,以便应用程序选择默认的后端。我还尝试更改了提到的身份验证模型的顺序,希望管理员页面首先选择默认模型,但仍然是一样的。@chatuur问题是,除了上面的问题,管理员登录被覆盖的原因可能有很多。在您上面提供的代码中似乎没有。查看更改默认管理员的各种方法:。这可能是其中一个问题。一个突出的问题是,如果您在某处有
admin.autodiscover()
,然后覆盖登录名。另一个是在模板中,您可以在其中覆盖默认的管理模板。这个问题很可能是上述问题的答案之一。