Rest Framework Swagger:实现没有用户名字段的自定义用户时出错

时间:2017-04-07 10:09:48

标签: django django-rest-framework swagger

我已经实现了一个自定义用户,其中包含电子邮件作为主键并删除了用户名字段。一切都很好,但是当我尝试启动招摇时,我得到了这个错误:

  

在/ api / v1 / swagger /字段名称username上配置不当对于模型CustomUser无效。

这是我的回溯与rest_framework_swagger:

ImproperlyConfigured at /api/v1/swagger/
Field name `username` is not valid for model `CustomUser`.

Request Method: GET
Request URL: http://localhost:8000/api/v1/swagger/
Django Version: 1.10.5
Python Executable: /Users/ngm/.virtualenvs/venv/bin/python
Python Version: 3.6.0
Python Path: ['/Users/ngm/PycharmProjects/hou', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages', '/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/pip-7.1.0-py3.6.egg',]
Server time: Fri, 7 Apr 2017 08:53:44 +0000
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'api.apps.ApiConfig',
 'rest_framework.authtoken',
 'rest_auth',
 'django.contrib.sites',
 'allauth',
 'allauth.account',
 'rest_auth.registration',
 'allauth.socialaccount',
 'allauth.socialaccount.providers.facebook',
 'phonenumber_field',
 'rest_framework_swagger']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback:  

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  477.             response = self.handle_exception(exc)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
  437.             self.raise_uncaught_exception(exc)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
  448.         raise exc

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  474.             response = handler(request, *args, **kwargs)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework_swagger/views.py" in get
  29.             schema = generator.get_schema(request=request)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/schemas.py" in get_schema
  240.         links = self.get_links(request)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/schemas.py" in get_links
  269.             link = self.get_link(path, method, view)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/schemas.py" in get_link
  368.         fields += self.get_serializer_fields(path, method, view)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/schemas.py" in get_serializer_fields
  484.         for field in serializer.fields.values():

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in fields
  336.             for key, value in self.get_fields().items():

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in get_fields
  977.                 field_name, info, model, depth

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in build_field
  1112.         return self.build_unknown_field(field_name, model_class)

File "/Users/ngm/.virtualenvs/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in build_unknown_field
  1219.             (field_name, model_class.__name__)

Exception Type: ImproperlyConfigured at /api/v1/swagger/
Exception Value: Field name `username` is not valid for model `CustomUser`.
Request information:
USER: m@gmail.com

GET: No GET data

POST: No POST data

FILES: No FILES data

COOKIES:
Pycharm-e15616ac = '2060dfb1-f0e4-45e9-86d8-8da3a138638f'
_ga = 'GA1.1.1443617960.1490863255'
tabstyle = 'html-tab'
csrftoken = 'EvhYgRo5559ISd1q355NH0MpiLE2LdS6RjFbgcbdlq7tN7KfkOumvjsczInSJHnv'
sessionid = '6989fmhdxu10znsview00sw7d0m2w2pg'

META:
ANDROID_SDK_HOME = '/Users/ngm/Documents/android-sdk-macosx'
APP_SETTINGS = 'config.DevelopmentConfig'
Apple_PubSub_Socket_Render = '/private/tmp/com.apple.launchd.zL9FpdGY5r/Render'
CONTENT_LENGTH = ''
CONTENT_TYPE = 'text/plain'
CSRF_COOKIE = 'EvhYgRo5559ISd1q355NH0MpiLE2LdS6RjFbgcbdlq7tN7KfkOumvjsczInSJHnv'
DATABASE_URL = 'postgresql://postgres:postgres@localhost/thanhthi'
DISPLAY = '/private/tmp/com.apple.launchd.swialSI3Ib/org.macosforge.xquartz:0'
DJANGO_SETTINGS_MODULE = 'hou.settings'
DYLD_LIBRARY_PATH = '/Users/ngm/torch/install/lib:'
GATEWAY_INTERFACE = 'CGI/1.1'
GEM_HOME = '/Users/ngm/.rvm/gems/ruby-2.3.1'
GEM_PATH = '/Users/ngm/.rvm/gems/ruby-2.3.1:/Users/ngm/.rvm/gems/ruby-2.3.1@global'
HOME = '/Users/ngm'
HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
HTTP_ACCEPT_ENCODING = 'gzip, deflate, sdch, br'
HTTP_ACCEPT_LANGUAGE = 'en-US,en;q=0.8,vi;q=0.6,ko;q=0.4'
HTTP_CACHE_CONTROL = 'max-age=0'
HTTP_CONNECTION = 'keep-alive'
HTTP_COOKIE = 'Pycharm-e15616ac=2060dfb1-f0e4-45e9-86d8-8da3a138638f; _ga=GA1.1.1443617960.1490863255; tabstyle=html-tab; csrftoken=EvhYgRo5559ISd1q355NH0MpiLE2LdS6RjFbgcbdlq7tN7KfkOumvjsczInSJHnv; sessionid=6989fmhdxu10znsview00sw7d0m2w2pg'
HTTP_HOST = 'localhost:8000'
HTTP_UPGRADE_INSECURE_REQUESTS = '1'
HTTP_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
IRBRC = '/Users/ngm/.rvm/rubies/ruby-2.3.1/.irbrc'
LC_CTYPE = 'UTF-8'
LD_LIBRARY_PATH = '/Users/ngm/torch/install/lib:'
LOGNAME = 'ngm'
LUA_CPATH = '/Users/ngm/torch/install/lib/?.dylib;/Users/ngm/.luarocks/lib/lua/5.1/?.so;/Users/ngm/torch/install/lib/lua/5.1/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so'
LUA_PATH = '/Users/ngm/.luarocks/share/lua/5.1/?.lua;/Users/ngm/.luarocks/share/lua/5.1/?/init.lua;/Users/ngm/torch/install/share/lua/5.1/?.lua;/Users/ngm/torch/install/share/lua/5.1/?/init.lua;./?.lua;/Users/ngm/torch/install/share/luajit-2.1.0-beta1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua'
MY_RUBY_HOME = '/Users/ngm/.rvm/rubies/ruby-2.3.1'
NDK_MODULE_PATH = '/Users/ngm/Documents/ndk/android-ndk-r10e'
OLDPWD = '/Users/ngm/PycharmProjects'
PATH = '/Users/ngm/.virtualenvs/venv/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Users/ngm/.rvm/gems/ruby-2.3.1/bin:/Users/ngm/.rvm/gems/ruby-2.3.1@global/bin:/Users/ngm/.rvm/rubies/ruby-2.3.1/bin:/Users/ngm/Downloads/apache-maven-3.3.9/bin:/Users/ngm/Documents/ndk/android-ndk-r10e:/Users/ngm/Documents/android-sdk-macosx/tools:/Users/ngm/Documents/android-sdk-macosx/platform-tools:/Library/Frameworks/Python.framework/Versions/3.4/bin:/Users/ngm/torch/install/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/ngm/.rvm/bin'
PATH_INFO = '/api/v1/swagger/'
PS1 = '(venv) \\h:\\W \\u\\$ '
PWD = '/Users/ngm/PycharmProjects/hou'
QUERY_STRING = ''
REMOTE_ADDR = '127.0.0.1'
REMOTE_HOST = ''
REQUEST_METHOD = 'GET'
RUBY_VERSION = 'ruby-2.3.1'
RUN_MAIN = 'true'
SCRIPT_NAME = ''
SERVER_NAME = '1.0.0.127.in-addr.arpa'
SERVER_PORT = '8000'
SERVER_PROTOCOL = 'HTTP/1.1'
SERVER_SOFTWARE = 'WSGIServer/0.2'
SHELL = '/bin/bash'
SHLVL = '1'
SSH_AUTH_SOCK = '/private/tmp/com.apple.launchd.ycnFwNh4Ib/Listeners'
TERM = 'xterm-256color'
TERM_PROGRAM = 'Apple_Terminal'
TERM_PROGRAM_VERSION = '387'
TERM_SESSION_ID = '5A3A4778-0648-46F3-899E-D60CF50F5FAB'
TMPDIR = '/var/folders/r7/dclxzr590qx2p1_lmgq9_k040000gn/T/'
TZ = 'UTC'
USER = 'ngm'
VIRTUAL_ENV = '/Users/ngm/.virtualenvs/venv'
XPC_FLAGS = '0x0'
XPC_SERVICE_NAME = '0'
_ = '/Users/ngm/.virtualenvs/venv/bin/python'
__CF_USER_TEXT_ENCODING = '0x1F5:0x0:0x0'
__PYVENV_LAUNCHER__ = '/Users/ngm/.virtualenvs/venv/bin/python'
_system_arch = 'x86_64'
_system_name = 'OSX'
_system_type = 'Darwin'
_system_version = '10.12'
rvm_bin_path = '/Users/ngm/.rvm/bin'
rvm_path = '/Users/ngm/.rvm'
rvm_prefix = '/Users/ngm'
rvm_version = '1.27.0 (latest)'
wsgi.errors = <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
wsgi.file_wrapper = ''
wsgi.input = <_io.BufferedReader name=7>
wsgi.multiprocess = False
wsgi.multithread = True
wsgi.run_once = False
wsgi.url_scheme = 'http'
wsgi.version = 

Settings:
Using settings module hou.settings
ABSOLUTE_URL_OVERRIDES = {}
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = 'email'
ADMINS = []
ALLOWED_HOSTS = ['192.168.0.104', '192.168.0.102', 'localhost', '127.0.0.1']
APPEND_SLASH = True
AUTHENTICATION_BACKENDS = 
AUTH_PASSWORD_VALIDATORS = '********************'
AUTH_USER_MODEL = 'api.CustomUser'
BASE_DIR = '/Users/ngm/PycharmProjects/hou'
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
CACHE_MIDDLEWARE_SECONDS = 600
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SECURE = False
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'hou', 'USER': 'postgres', 'PASSWORD': '********************', 'HOST': '127.0.0.1', 'PORT': '', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'NAME': None, 'MIRROR': None}}}
DATABASE_ROUTERS = []
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
DATETIME_FORMAT = 'N j, Y, P'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = True
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_CHARSET = 'utf-8'
DEFAULT_CONTENT_TYPE = 'text/html'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = 'webmaster@localhost'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
DISALLOWED_USER_AGENTS = []
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_PASSWORD = '********************'
EMAIL_HOST_USER = 'ez.web.video.cast@gmail.com'
EMAIL_PORT = 587
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '********************'
EMAIL_SUBJECT_PREFIX = '[Django] '
EMAIL_TIMEOUT = None
EMAIL_USE_SSL = False
EMAIL_USE_TLS = True
FILE_CHARSET = 'utf-8'
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = None
FILE_UPLOAD_TEMP_DIR = None
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'api.apps.ApiConfig', 'rest_framework.authtoken', 'rest_auth', 'django.contrib.sites', 'allauth', 'allauth.account', 'rest_auth.registration', 'allauth.socialaccount', 'allauth.socialaccount.providers.facebook', 'phonenumber_field', 'rest_framework_swagger']
INTERNAL_IPS = []
LANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]
LANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = None
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LOCALE_PATHS = []
LOGGING = {}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = '/accounts/profile/'
LOGIN_URL = '/accounts/login/'
LOGOUT_REDIRECT_URL = None
MANAGERS = []
MEDIA_ROOT = '/Users/ngm/PycharmProjects/hou/hou/media'
MEDIA_URL = '/media/'
MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']
MIDDLEWARE_CLASSES = ['django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware']
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
NUMBER_GROUPING = 0
PASSWORD_HASHERS = '********************'
PASSWORD_RESET_TIMEOUT_DAYS = '********************'
PHONENUMBER_DEFAULT_REGION = 'VN'
PREPEND_WWW = False
PROJECT_DIR = '/Users/ngm/PycharmProjects/hou/hou'
REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)}
ROOT_URLCONF = 'hou.urls'
SECRET_KEY = '********************'
SECURE_BROWSER_XSS_FILTER = False
SECURE_CONTENT_TYPE_NOSNIFF = False
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_HSTS_SECONDS = 0
SECURE_PROXY_SSL_HEADER = None
SECURE_REDIRECT_EXEMPT = []
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = False
SERVER_EMAIL = 'root@localhost'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SECURE = False
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE = 'hou.settings'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
SHORT_DATE_FORMAT = 'm/d/Y'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = []
SITE_ID = 1
STATICFILES_DIRS = []
STATICFILES_FINDERS = ['django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder']
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = None
STATIC_URL = '/static/'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': {'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages']}}]
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'P'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'UTC'
USE_ETAGS = False
USE_I18N = True
USE_L10N = True
USE_THOUSAND_SEPARATOR = False
USE_TZ = True
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
WSGI_APPLICATION = 'hou.wsgi.application'
X_FRAME_OPTIONS = 'SAMEORIGIN'
YEAR_MONTH_FORMAT = 'F Y'

以下是CustomUser模型:

class CustomUserManager(BaseUserManager):
    """
    A custom user manager to deal with emails as unique identifiers for auth
    instead of usernames. The default that's used is "UserManager"
    """
    def _create_user(self, email, password, **extra_fields):
        """
        Creates and saves a User with the given username, email and password.
        """
        if not email:
            raise ValueError('Users must have an email address')
        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):
        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):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', 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 CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = CustomUserManager()
    USERNAME_FIELD = 'email'

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        "Returns the short name for the user."
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email], **kwargs)

2 个答案:

答案 0 :(得分:1)

您应该从序列化程序的字段列表中删除“用户名”。

答案 1 :(得分:0)

最后,我发现问题来自第三方lib的序列化程序。就我而言,它是rest_auth。我需要自定义它,从所有序列化程序类中删除“用户名”字段。

相关问题