【问题标题】:Python - Add custom user models in Django admin not workingPython - 在 Django 管理员中添加自定义用户模型不起作用
【发布时间】:2020-04-07 11:52:01
【问题描述】:

我正在使用 Python(3.7) 和 Django(2.2) 开展一个项目,在该项目中,我已经为多种用户类型实现了我的模型,其中自定义 user 模型作为基本模型。除了管理员,一切正常,我已将这些模型注册到管理员,但是当我尝试从管理员界面添加对象时,它给出了错误。

这是我迄今为止尝试过的:

来自models.py

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=254, unique=True)
    title = models.CharField(max_length=255, blank=False)
    user_type = models.CharField(max_length=255, choices=USER_TYPE, blank=False)
    gender = models.CharField(max_length=255, choices=CHOICES, blank=False)
    contenst = models.CharField(max_length=255, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['password']

    objects = UserManager()

    def get_absolute_url(self):
        return "/users/%i/" % (self.pk)


class PersonalBelow18(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    dob = models.DateField(blank=False)
    customer_id = models.BigIntegerField(blank=False)
    collection_use_personal_data = models.BooleanField(blank=False)
    reference_identities = models.ForeignKey(Identities, blank=False, on_delete=models.CASCADE, related_name='refs')

    def __str__(self):
        return self.user.email+'\'s account with ' + str(self.customer_id)


class PersonalAbove18(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    dob = models.DateField(blank=False)
    customer_id = models.BigIntegerField(blank=False)
    contact_email = models.EmailField(blank=False)
    reference_identities = models.ForeignKey(Identities, blank=False, on_delete=models.CASCADE)
    contact_no = PhoneNumberField(blank=True, help_text='Phone number must be entered in the'
                                                        'format: \'+999999999\'. Up to 15 digits allowed.')

    collection_use_personal_data = models.BooleanField(blank=False)

    def __str__(self):
        return self.user.email+'\'s account with ' + str(self.customer_id)


class Parent(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    contact_email = models.EmailField(blank=False)
    customer_id = models.BigIntegerField(blank=True)
    contact_no = PhoneNumberField(blank=True, help_text='Phone number must be entered in the'
                                                        'format: \'+999999999\'. Up to 15 digits allowed.')
    collection_use_personal_data = models.BooleanField(blank=False)


class GroupContactPerson(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    contact_email = models.EmailField(blank=False)
    customer_id = models.BigIntegerField(blank=False)
    contact_no = PhoneNumberField(blank=True, help_text='Phone number must be entered in the'
                                                        'format: \'+999999999\'. Up to 15 digits allowed.')
    department = models.CharField(max_length=255, blank=False)
    address = models.TextField(max_length=255, blank=False)

以下是我将这些模型注册到管理员的方法:

来自admin.py

class UserAdmin(BaseUserAdmin):
    fieldsets = (
        (None, {'fields': ('email', 'password', 'title', 'user_type',
                           'gender', 'contenst', 'last_login')}),
        ('Permissions', {'fields': (
            'is_active', 
            'is_staff', 
            'is_superuser',
            'groups', 
            'user_permissions',
        )}),
    )
    add_fieldsets = (
        (
            None,
            {
                'classes': ('wide',),
                'fields': ('email', 'password1', 'password2')
            }
        ),
    )

    list_display = ('email', 'title', 'is_staff', 'last_login')
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ('groups', 'user_permissions',)

admin.site.register(User, UserAdmin)
admin.site.register(PersonalBelow18)
admin.site.register(PersonalAbove18)
admin.site.register(Parent)
admin.site.register(GroupContactPerson)

ParentGroupContactPerson 模型在管理方面运行良好,但是当我尝试为 PersonalBelow18PersonalAbove18 模型添加对象时,它给出以下错误:

TypeError: str 返回非字符串(int 类型)

【问题讨论】:

  • 请发布错误的完整堆栈跟踪。
  • 另外,是否声明了身份模型 str 方法?如果其中有任何错误,可能是由于 PersonalBelow18 管理界面中显示的 FK 导致错误的原因。
  • @IgorBelkov 我已将__str__ 方法添加到上述所有模型中。
  • @Abdul Rehman 正如我在答案中看到的那样,问题出在身份模型中,正如我所提到的 ^_^ 在出现此错误的情况下,这是 Django 的典型情况,因此您不仅需要检查应用程序中的模型,以及所有连接。很高兴你解决了。

标签: python django python-3.x django-models django-admin


【解决方案1】:

以下是我在这些模型中调试此问题的方法:

  1. 我开始一一删除所有字段
  2. modelform 中删除一个字段并执行迁移
  3. 然后测试管理员

然后我发现当我删除 reference_identities 字段时它开始工作,所以我知道这个模型正在返回一个整数,所以我修复了那个模型并解决了这个问题。

简而言之,通过逐个删除字段并测试管理员来找到通往实际问题位置的路径是一种很好的方法。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2013-06-01
    • 2019-10-05
    • 1970-01-01
    • 2022-08-12
    • 2015-05-12
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多