Django Admin 删除用户异常 - Django 电话号码

问题描述

我有一个运行良好的 django 项目。我要求包括电话验证,所以我使用了 twilio 并使用了 django [电话号码] [1]。我完成了验证部分,一切正常,直到我在尝试从管理面板删除用户时注意到以下异常。

我不能 100% 确定它是否与电话号码有关,因为这是添加到项目中的唯一新内容。我尝试从管理面板添加和更新新用户效果很好。问题在于删除用户

Request URL: http://127.0.0.1:8000/admin/projectapp/customuser/

Django Version: 3.0.8
Python Version: 3.8.4
Installed Applications:
['django.contrib.admin','django.contrib.gis','projectapp','django.contrib.sites','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','phonenumber_field','verify_email.apps.VerifyEmailConfig','allauth','allauth.account','allauth.socialaccount','allauth.socialaccount.providers.google']
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 (most recent call last):
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\core\handlers\exception.py",line 34,in inner
    response = get_response(request)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\core\handlers\base.py",line 115,in _get_response
    response = self.process_exception_by_middleware(e,request)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\core\handlers\base.py",line 113,in _get_response
    response = wrapped_callback(request,*callback_args,**callback_kwargs)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\options.py",line 607,in wrapper
    return self.admin_site.admin_view(view)(*args,**kwargs)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\utils\decorators.py",line 130,in _wrapped_view
    response = view_func(request,*args,**kwargs)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\views\decorators\cache.py",line 44,in _wrapped_view_func
    response = view_func(request,**kwargs)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\sites.py",line 231,in inner
    return view(request,line 43,in _wrapper
    return bound_method(*args,**kwargs)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\options.py",line 1704,in changelist_view
    response = self.response_action(request,queryset=cl.get_queryset(request))
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\options.py",line 1390,in response_action
    response = func(self,request,queryset)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\actions.py",line 28,in delete_selected
    deletable_objects,model_count,perms_needed,protected = modeladmin.get_deleted_objects(queryset,request)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\options.py",line 1826,in get_deleted_objects
    return get_deleted_objects(objs,self.admin_site)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\utils.py",line 151,in get_deleted_objects
    to_delete = collector.nested(format_callback)
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\utils.py",line 211,in nested
    roots.extend(self._nested(root,seen,format_callback))
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\utils.py",line 195,in _nested
    children.extend(self._nested(child,line 197,in _nested
    ret = [format_callback(obj)]
  File "D:\installedSoft\Python\python38-32\lib\site-packages\django\contrib\admin\utils.py",line 126,in format_callback
    no_edit_link = '%s: %s' % (capfirst(opts.verbose_name),obj)

Exception Type: TypeError at /admin/projectapp/customuser/
Exception Value: __str__ returned non-string (type nonetype)

这是我的用户模型类

class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(_('email address'),unique=True)
    zipcode = models.CharField(max_length=10,blank=True,verbose_name='zip code')
    full_name = models.CharField(max_length=100,verbose_name='Full name')
    gender = models.CharField(max_length=8,verbose_name='gender')
    donation_amount = models.FloatField(max_length=10,blank=False,default=0,verbose_name='donation amount' )
    phone_number = PhoneNumberField(null=False,unique=True) #models.BigIntegerField(blank=True)
    country_code = models.IntegerField(default=1)
    two_factor_auth = models.BooleanField(default=False)
    is_verified =  models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    required_FIELDS =  ['full_name','phone_number','country_code']

    objects = CustomUserManager()

    def __str__(self):
        return self.email

解决方法

更改自定义用户模型的 str 方法。确保该方法永远不会返回 None。