19

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

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

4 回答 4

46

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

模型.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.")

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

设置.py

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

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

模型.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
于 2012-11-19T19:34:10.867 回答
6

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

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

为了实现这一点

1.我们可以有一个单独的新表,其中包含email id & DOB 列,这样User 模型中的列与新表中的列映射。但这将为每个数据库请求创建一个新的数据库实例。说如果你想找到客户的出生日期,

  • 首先,我们需要从 User 表中获取客户映射 id 的值。
  • 使用上述值,从新表中获取 DOB。

在第二种方法中,

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

为了克服上述问题,django 引入了 django profile,它非常简单且更灵活。优点是

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

如何使用这个:

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

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

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

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

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

于 2012-11-19T20:13:46.057 回答
6

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

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

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

于 2014-01-25T04:17:50.993 回答
2

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

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

于 2012-11-19T19:29:59.947 回答