【问题标题】:How to set Django Admin to show all User's attributes in his User Profile tab?如何设置 Django Admin 以在他的用户配置文件选项卡中显示所有用户的属性?
【发布时间】:2016-04-07 05:59:36
【问题描述】:

我正在处理一个Django 项目。我有两种类型的成员(用户资料)——客户和翻译。我想在 Django Admin 中查看这些配置文件,包括它的用户属性,如 usernamesurename 等。

现在,当我创建名为 Thomas 的 UserTranslatorProfile 时,我可以在 UsersAuthDjango Admin 中看到他的姓名、用户名等,以及在 UserTranslatorProfiles 中属于它的配置文件的其他属性这很不舒服。 (在UserTranslatorProfile 中,我可以看到它是哪个用户,但我看不到他的属性,也无法更改它们)。

这两个配置文件在这里:

class UserTranslatorProfile(models.Model):
    user = models.OneToOneField(User)
    languages = models.ManyToManyField(Language)

class UserCustomerProfile(models.Model):
    user = models.OneToOneField(User)

他们当然是在admin.py注册的

所以问题是:是否可以通过点击Django-Admin 中的UserProfile 来查看所有UserUserProfile 属性?

【问题讨论】:

    标签: python django django-models django-admin django-users


    【解决方案1】:

    UserTranslatorProfiles添加ModelAdmin,并将usernameemail等相关字段添加到fields属性中。

    ModelAdmin 被放入admin.py 文件中,它们进一步自定义模型在管理员中的显示方式。

        from django.contrib import admin
        from myproject.myapp.models import UserTranslatorProfiles # Import your model
    
        class UserTranslatorProfilesAdmin(admin.ModelAdmin):
            fields = ('username', 'email, ) # Enter full list of fields here
    
        admin.site.register(UserTranslatorProfiles, UserTranslatorProfilesAdmin)
    

    【讨论】:

    • 谢谢阿布,你能详细说明一下吗?我不知道如何以及在哪里添加 ModelAdmin。例如,我检查了这个网址:patrick.arminio.info/additional-admin-views,但没有帮助。
    • 嗯,它不起作用。异常值:为 UserTranslatorProfile 指定的未知字段 (first_name)。检查类 UserTranslatorProfileAdmin 的字段/字段集/排除属性。但我认为 first_name 属于每个用户,所以它应该是正确的。
    • 我已将其添加到 admin.py 中:class UserTranslatorProfileAdmin(admin.ModelAdmin): fields = ('first_name',) admin.site.register(UserTranslatorProfile, UserTranslatorProfileAdmin)
    • 哦,您使用了user 作为外键。这不适用于外键。您需要对用户进行子类化。 class UserTranslatorProfile(User)
    【解决方案2】:

    只需要设置 ModelAdmin 并在管理站点注册它

    step 1: 如果不存在,请在您的应用程序中创建一个 admin.py。
    step-2: 导入您要在管理站点上显示的模型。
    step-3: 创建一个管理模型并在管理员处注册地点。

    from django.contrib import admin
    from myproject.myapp.models import Author #import your model
    class AuthorAdmin(admin.ModelAdmin):
          fields = ('name', 'title', 'view_birth_date')# define-fields
    
    
    admin.site.register(Author, AuthorAdmin) #now register your custom-admin model
    

    了解更多
    https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#modeladmin-objects

    【讨论】:

    • // 在 Python 中不能用作单行注释。你必须使用#。示例:ideone.com/mzkkT1
    • 这不起作用。我已将此添加到我的 admin.py 中,并且仅在字段中添加了一个属性 - 'first_name',它肯定存在于内置用户中。但它不起作用:异常值:为 UserTranslatorProfile 指定的未知字段(first_name)。检查 UserTranslatorProfileAdmin 类的字段/字段集/排除属性。
    • 当它不属于配置文件但属于用户时,它应该从哪里知道我想要这个属性?
    【解决方案3】:

    不幸的是,这比它需要/应该更困难。如果没有内联管理员,管理员添加/更改表单仅用于编辑一个模型。

    如果您能够更改用户模型,则可以通过创建自己的继承自 User 的自定义 User 对象来完成此操作。然后,在 settings.py 中,将 AUTH_USER_MODEL 设置为您的新模型。请注意,这应该在数据输入之前完成,并且您的第一次迁移已经完成(因此您需要重新开始。)

    如果你不能这样做,我可以想到你可以采取的另外两个方向:

    更简单:为用户对象创建一个内联管理员,并将其注册到您的翻译对象。然后,您将在页面底部的内联管理员中有一行,可用于编辑用户。从最终用户 UX 的角度来看,我讨厌这个,但它可以完成工作。

    整洁:创建一个自定义表单,在 User 模型中添加与您要编辑的字段相对应的字段,然后在表单的 clean 和 save 方法中,验证/保存底层 User 对象的方法。例如,创建表单字段“tra_username”、“tra_firstname”、“tra_password”...然后,在表单的保存方法中(验证后),为每个字段执行此操作

    UserCustomProfile.user.first_name = form.cleaned_data.get("tra_firstname")`
    UserCustomProfile.user.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多