在Django中,如何将数据存储在与User表关联的UserProfile表中?

时间:2012-01-17 21:21:50

标签: django django-models django-users

我正在尝试关注文档并在我的模型中设置UserProfile表,将其与管理区域中的User表关联,然后在注册时在UserProfile表中存储有关我的用户的其他信息。

views.py我有以下内容:

from django.contrib.auth import authenticate, login, logout


def register(request):
    if request.method == 'POST':
        query_dict = request.POST
        username = query_dict.__getitem__("username")
        email = query_dict.__getitem__("user_email")
        password = query_dict.__getitem__("password")
        repeat_password = query_dict.__getitem__("repeat_password")
        role = query_dict.__getitem__("role")
        user = User.objects.create_user(username, email, password)
        # django.db.models.signals.post_save gets called here and creates the UserProfile
        # I can write something like user_profile = user.get_profile() but I don't
        # know how to save information to the profile.
        user = authenticate(username=username, password=password)

        if user is not None and user.is_active:
            login(request, user)
            return HttpResponseRedirect("/")

正如您在上面的代码中的注释中所看到的,我可以检索关联的UserProfile对象,但我不知道从那里到哪里将其他数据(角色)存储在UserProfile表中。所有文件都告诉我:

  

get_profile()   返回此用户的特定于站点的配置文件。加薪   django.contrib.auth.models.SiteProfileNotAvailable如果   当前站点不允许配置文件,或   django.core.exceptions.ObjectDoesNotExist如果用户没有   轮廓。

您可以在此处查看:https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.get_profile

但是文档没有告诉我什么类型的对象get_profile()返回,或者我如何使用它来存储UserProfile表中的信息。

2 个答案:

答案 0 :(得分:4)

User.get_profile()会返回您AUTH_PROFILE_MODULE设置的所有内容的实例。您将其设置为"yourapp.UserProfile"(根据yourapp进行调整)。然后你应该可以做这样的事情:

from yourapp.models import UserProfile
profile = user.get_profile()
assert isinstance(profile, UserProfile)
profile.role = role
profile.save() # saves to DB

您实际上并不需要导入或断言行 - 这只是为了您理智地检查UserProfile是否符合预期。

答案 1 :(得分:1)

从您关联的页面:

“请参阅下面有关存储其他用户信息的部分。”,参考https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

该部分告诉您有一个设置“AUTH_PROFILE_MODULE”,它声明了User.get_profile将返回的模型。

您还需要按照在User模型上设置post_save信号处理程序的说明,在每次创建User对象时自动创建配置文件模型的实例。如果你不这样做,那么User.get_profile()可以并且将抛出异常。