Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django的管理页面中为用户添加字段_Python_Django - Fatal编程技术网

Python 在django的管理页面中为用户添加字段

Python 在django的管理页面中为用户添加字段,python,django,Python,Django,这个问题似乎很简单,但我找不到解决办法。我需要在django中扩展我的用户模型(添加电话号码),我选择了创建另一个名为UserInfo的模型的方法,该模型与用户模型1相关。它工作得很好,唯一的问题是我无法在管理面板的用户页面上显示UserInfo字段(电话号码)。我尝试的是: from app.models import UserInfo from django.contrib import admin from django.contrib.auth.models import User c

这个问题似乎很简单,但我找不到解决办法。我需要在django中扩展我的用户模型(添加电话号码),我选择了创建另一个名为UserInfo的模型的方法,该模型与用户模型1相关。它工作得很好,唯一的问题是我无法在管理面板的用户页面上显示UserInfo字段(电话号码)。我尝试的是:

from app.models import UserInfo
from django.contrib import admin
from django.contrib.auth.models import User

class UserInfoInline(admin.TabularInline):
    model = UserInfo
class UserAdmin(admin.ModelAdmin):
    inlines = [UserInfoInline,]

admin.site.register(UserInfo)
编辑: 目前的情况是:

try:
    admin.site.unregister(User)
except admin.sites.NotRegistered:
    pass
try:
    admin.site.register(User, UserAdmin)
except:
    pass
但我仍然得到了错误,这一次来自唯一的django模块:

python3.6/site-packages/django/contrib/admin/sites.py", line 109, in register
    raise AlreadyRegistered('The model %s is already registered' % model.__name__)
django.contrib.admin.sites.AlreadyRegistered: The model User is already registered

您需要重新注册用户管理员

try:
    admin.site.unregister(User)
except admin.sites.NotRegistered:
    pass
admin.site.register(User, UserAdmin)

您应该做的是注销默认用户并注册
UserAdmin

from app.models import UserInfo
from django.contrib import admin
from django.contrib.auth.models import User

class UserInfoInline(admin.TabularInline):
    model = UserInfo
class UserAdmin(admin.ModelAdmin):
    inlines = [UserInfoInline,]

# below lines should be added
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
尝试删除用户信息的注册部分

编辑: 尝试以下示例,这是一个有效的示例:

型号.py

from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    STUDENT = 1
    TEACHER = 2
    SUPERVISOR = 3
    ROLE_CHOICES = (
        (STUDENT, 'Student'),
        (TEACHER, 'Teacher'),
        (SUPERVISOR, 'Supervisor'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    birthdate = models.DateField(null=True, blank=True)
    role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, null=True, blank=True)

    def __str__(self):  # __unicode__ for Python 2
        return self.user.username

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

from .models import Profile

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
admin.py

from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    STUDENT = 1
    TEACHER = 2
    SUPERVISOR = 3
    ROLE_CHOICES = (
        (STUDENT, 'Student'),
        (TEACHER, 'Teacher'),
        (SUPERVISOR, 'Supervisor'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    birthdate = models.DateField(null=True, blank=True)
    role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, null=True, blank=True)

    def __str__(self):  # __unicode__ for Python 2
        return self.user.username

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

from .models import Profile

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

您可以阅读更多信息。

尝试
admin.site.register(UserInfo,UserAdmin)
请用您看到的内容更新您的问题?您打算在管理站点的用户页面上显示的内容,没有任何更改。我已将您的代码连接到下面的try/except块(因为我收到的是NotRegistered错误),现在我收到了AlreadyRegistered错误。因此,django似乎既不注销也不注册用户。删除用户信息部分你能更具体一点吗?我没有,用另一个通过1to1关系连接的模型扩展用户的目的是避免编辑默认的身份验证用户_MODEL@Jacek我不知道你在剩下的代码里是怎么做的,所以我更新了我的答案,在管理面板中添加了一个完整的用户合并指南。正如我在下面评论的那样,django似乎不允许我注销用户。为什么?你确定你注销了用户,而不是用户信息吗?用当前情况更新主帖我认为在注册原始用户管理员时发生了此错误,这可能是因为你的应用程序列在默认的django.contrib.auth上方的已安装应用程序中。把它移到后面。