Python 为用户创建自定义登录名更改了“我的管理员”的登录名。如何预防?

Python 为用户创建自定义登录名更改了“我的管理员”的登录名。如何预防?,python,django,Python,Django,我正在创建一个web应用程序,用户必须在其中注册自己并创建配置文件。我正在使用Django提供的“AbstractBaseUser”类,因为我想添加一些其他字段。现在,当用户登录时,我希望登录凭据是移动电话号码和密码。我为此创建了一个自定义身份验证函数,并将其注册到my settings.py中。问题是,这改变了登录到我的管理员坐,我想保持不变 我遵循了从本教程向用户添加自定义字段的教程 My models.py: from django.db import models from django

我正在创建一个web应用程序,用户必须在其中注册自己并创建配置文件。我正在使用Django提供的“AbstractBaseUser”类,因为我想添加一些其他字段。现在,当用户登录时,我希望登录凭据是移动电话号码和密码。我为此创建了一个自定义身份验证函数,并将其注册到my settings.py中。问题是,这改变了登录到我的管理员坐,我想保持不变

我遵循了从本教程向用户添加自定义字段的教程

My models.py:

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()
,然后覆盖登录名。另一个是在模板中,您可以在其中覆盖默认的管理模板。这个问题很可能是上述问题的答案之一。