【问题标题】:get user profile in django在 django 中获取用户配置文件
【发布时间】:2012-11-07 18:23:00
【问题描述】:

你好,我是 python 和 django 的新手 我需要一个获取当前用户配置文件的视图,我知道我应该使用来自 User 的 get_profile 但我不知道如何使用它。我阅读了 django 文档,但对我没有帮助。 这是我从文档中找到的:

from django.contrib.auth.models import User
profile=request.user.get_profile()

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    Django 的文档说明了一切,特别是 Storing additional information about users 部分。首先,您需要在 models.py 的某处定义一个模型,其中包含用户附加信息的字段:

    models.py

    from django.contrib.auth.models import User
    
    class UserProfile(models.Model):
        # This field is required.
        user = models.OneToOneField(User)
    
        # Other fields here
        accepted_eula = models.BooleanField()
        favorite_animal = models.CharField(max_length=20, default="Dragons.")
    

    然后,您需要通过在您的settings.py 中设置AUTH_PROFILE_MODULE 来表明此模型(UserProfile)是用户配置文件:

    settings.py

    ...
    AUTH_PROFILE_MODULE = 'accounts.UserProfile'
    ...
    

    您需要将accounts 替换为您的应用名称。最后,您希望在每次创建 User 实例时通过注册 post_save 处理程序来创建配置文件,这样每次创建用户时 Django 也会创建他的配置文件:

    models.py

    from django.contrib.auth.models import User
    
    class UserProfile(models.Model):
        # This field is required.
        user = models.OneToOneField(User)
    
        # Other fields here
        accepted_eula = models.BooleanField()
        favorite_animal = models.CharField(max_length=20, default="Dragons.")
    
    
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
    
    post_save.connect(create_user_profile, sender=User)
    

    访问个人资料

    要在您的视图中访问当前用户的个人资料,只需使用请求提供的User 实例,并在其上调用get_profile

    def your_view(request):
        profile = request.user.get_profile()
        ...
        # Your code
    

    【讨论】:

    • Tnx 为您解答,但我的问题在视图部分.. 我已经有了我的模型,但我不知道如何在视图中使用我的模型详细信息
    • @nim4n 在您的视图中,您已经在请求中拥有用户。因此,要获取配置文件,您只需执行以下操作: profile = request.user.get_profile()
    • 它是否适用于 1.5?好像从1.5开始就没有auth_profile,而是auth_model
    • @ПавелТявин AUTH_PROFILE_MODULE 在 Django 1.5 中不受支持
    • AUTH_PROFILE_MODULE 和 get_profile() 已弃用。请将其添加到您的答案中
    【解决方案2】:

    基本上,django 用户模型将只提供对字段(名字、姓氏、电子邮件、密码、is_staff、is_active、last_login)的访问权限。

    但是,如果我们想在这个模型中添加任何额外的字段,比如我们需要为每个用户添加一个名为 dateofbirth 的新列,那么我们需要在 User 模型中添加一个名为 DOB 的列。但这是不可能的,因为我们无法编辑 django 用户模型。

    为了达到这个目的

    1.我们可以有一个单独的新表,其中包含电子邮件 id 和 DOB 列,这样用户模型中的列与新表中的列映射。但这将为每个数据库请求创建一个新的数据库实例。假设你想找到客户的 DOB,

    • 首先我们需要从 用户表。
    • 使用上述值,从新表中获取 DOB。

    在第二种方法中,

    不要使用 django 用户模型,而是使用您自己的自定义模型以及所需的所有字段。但是,如果任何与安全相关的更新或对 django 用户模型进行了某些增强,我们就不能直接使用它。我们需要在最后做更多的代码更改(无论我们在哪里使用我们的自定义模型。)这对于开发人员来说识别代码并进行更改会有点痛苦。

    为了克服上述问题,django 引入了 django 配置文件,该配置文件非常简单且更灵活。优点是

    • 无需过多修改代码即可应用对用户模型的更新/增强
    • 无需创建新的数据库实例来获取额外的值。
    • 由于该字段具有 onetoone 映射,从一个表中删除数据也会删除其他表。
    • 更安全,因为我们使用 django 模型(无 sql 注入)

    如何使用:

    在 settings.py 创建一个变量 AUTH_PROFILE_MODULE = "appname.profiletable"

    • 在 models.py 中,创建一个包含所需字段的新表,并确保 User 模型中的 id 与新表单映射。
    • 创建一个信号,只要将新条目添加到用户模型中,该信号就会在新表中插入一行。
    • 可以使用 User 对象本身访问新表中的值。

    说,我们创建了一个新的表 extrauser,它有 DOB,emailid。要查找客户的出生日期,请使用

    a=User.objects.get(email='x@x.xom')
    a.get_profile().DOB will give the dateofbirth value from extrauser table.
    

    希望以上细节能让您清楚地了解 django 配置文件。如果有任何进一步的帮助,请告诉我。我在我的项目中使用了 django 配置文件。

    【讨论】:

    • Tnx 了解详情。我创建了我的用户个人资料并使用管理界面进行管理,但我需要在我的视图中获取当前用户个人资料,我不知道该怎么做
    【解决方案3】:

    老问题,但我认为今天看到它的任何人都可以从中受益:

    Django 1.5 增加了——轻松地——扩展用户模型的能力。这可能更可取,因为您现在只需要处理一个对象而不是两个!似乎更现代的方式。

    https://hurricanelabs.com/blog/django-user-models/

    【讨论】:

    • 链接已损坏@wjdp
    • 更新了从 Wayback 机器到存档版本的链接。尽管我建议您另外查看一些最近的文章,因为这可能已经过时了。
    【解决方案4】:

    您需要通过设置AUTH_PROFILE_MODULE = 'accounts.UserProfile'(例如)来指定哪个类是您的“个人资料”

    https://docs.djangoproject.com/en/1.4/topics/auth/

    【讨论】:

    • 能否请您检查这个 SO 问题 stackoverflow.com/questions/17806683/… 并指导我如何实施。
    • 在您引用的问题中,用户没有“位置”属性,因为位置具有用户的外键。因此,用户实例将具有“location_set”属性。
    • 我尝试使用 OneToOneField,当时我遇到了这个问题“setting.models.DoesNotExist:位置匹配查询不存在。”在控制台中创建超级用户。
    • 很难说没有看到一些代码:) 用一些示例代码发布一个问题,以便我和其他人可以更好地了解发生了什么。
    • 我更新了问题中的尝试代码和回溯,请检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-04-07
    • 1970-01-01
    • 2015-07-08
    • 2015-02-09
    相关资源
    最近更新 更多