В Django, как я могу хранить данные в моей таблице UserProfile, связанной с таблицей User? - PullRequest
0 голосов
/ 18 января 2012

Я пытаюсь следовать документации и настроить таблицу 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 ]

4 голосов
/ 18 января 2012

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 голос
/ 18 января 2012

Со страницы, на которую вы ссылаетесь:

"см. Раздел о хранении дополнительной пользовательской информации ниже.", Ссылаясь на https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

В этом разделе сообщается, что существует параметр «AUTH_PROFILE_MODULE», который объявляет модель, которую вернет User.get_profile.

Вы также захотите следовать инструкциям по настройке обработчика сигнала post_save для модели User, чтобы автоматически создавать экземпляр модели вашего профиля каждый раз, когда создается объект User. Если вы этого не сделаете, то User.get_profile () может и будет выдавать исключения.

...