我正在django上开发一个网站。当我试图通过管理面板删除一个用户时,我得到了一个错误。我可以更改例如员工状态(虽然仍然得到一个错误,但更改正在应用)代码如下:
models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
emailSpam = models.BooleanField(default=True)
email = models.EmailField('email', unique=True)
first_name = None
last_name = None
confirmedEmail = models.BooleanField(default=False)
REQUIRED_FIELDS = ["emailSpam"]
forms.py
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import User
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = User
fields = ('email',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = User
fields = ('email',)
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import User
class Admin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = User
list_display = ('email', 'is_staff', 'is_active',)
list_filter = ('email', 'is_staff', 'is_active',)
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Permissions', {'fields': ('is_staff', 'is_active')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active')}
),
)
search_fields = ('email',)
ordering = ('email',)
admin.site.register(User, Admin)
1条答案
按热度按时间8yparm6h1#
可能的解决方案
至少就我所知,有三件事 * 可能 * 导致了这个问题。第一件事你已经忽略了。我希望这是第二个解决方案,因为那会更容易,但我担心这可能是第三个,这将是最难绕过。
"原因一"
正如我的评论所说,也许有 * 另一个 * 模型的字段将
User
作为on_delete = models.CASCADE
的ForeignKey
。(因为on_delete=models.CASCADE
),这就是导致问题的原因。您已经声明没有此类型号,因此让我们转到解决方案2。"原因二"
我希望是这个,因为它可能更容易修复。我注意到您的用户模型中有一个字段
email = models.EmailField('email', unique=True)
,但是AbstractUser
应该已经有一个字段email
。请尝试删除该字段,进行迁移并迁移,看看问题是否得到解决。"原因三"
在项目中期,您是否从默认的
User
模型更改为您现在使用的自定义用户?换句话说,在这个项目中,您 * 是否 * 在切换到自定义用户模型之前运行过makemigrations
?这可能是一个大问题。然而,有两种解决方案,不那么容易或理想,但可行。__pycache__
文件夹(如here所述)。然后重新执行python manage.py makemigrations
和python manage.py migrate
。当然,这将擦除所有表,因此您不希望在项目中期执行此操作。