Как в django правильно сделать userprofile?

Здравствуйте! Есть модели:
class UserProfile(models.Model):  
     user = models.OneToOneField(User)

class Project(models.Model):
     title = models.CharField(max_length=200, verbose_name=u'Название')
     slug = models.SlugField(unique=True, verbose_name=u'URL')
     user = models.ForeignKey(UserProfile, verbose_name=u'Пользователь')

Есть страница добавление проекта (модели project), ее могут добавлять зарегистрированные пользователи, ее вьюха:
class ProjectCreate(CreateView):
    model = Project
    template_name = 'add_project.html'
    form_class = AddProjectForm
    success_url = '/project/success'
    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(ProjectCreate, self).form_valid(form)

Поле user в форме скрыто и хочу сделать, чтобы по умолчанию при добавлении проекта добавлялся текущий пользователь. Но выдает такую ошибку:
Cannot assign "<SimpleLazyObject: <User: galkinav>>": "Project.user" must be a "UserProfile" instance.

Понимаю, что вместо user надо использовать userprofile, но не могу сообразить как. Помогите пожалуйста.
  • Вопрос задан
  • 2818 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Сам процесс создания профиля элементарен.
profile = UserProfile(user=request.user)
profile.save()

Чуть больше возможностей для творчества в том, где именно его создавать.

Вариант №1 monkey patching:
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])


Вариант №2 в том же models.py, где объявлена модель профиля:
@receiver(post_save, sender=User, dispatch_uid="create_profile")
def update_profile(sender, instance, **kwargs):
    if kwargs["created"]:
        UserProfile.objects.create(user=instance)

Если используется что-нибудь типа django-registration, то можно использовать её сигналы.

Вариант №3 в auth.py (если используете свой механизм аутентификации):
class SomeAuthBackend(ModelBackend):
    def get_user(self, user_id):
        try:
            user = User.objects.select_related('profile_set').get(pk=user_id)
            try:
                user.profile_set
            except UserProfile.DoesNotExist:
                UserProfile.objects.create(user=user)
            return user
        except User.DoesNotExist:
            return None

Профиль будет создаваться при входе пользователя.

Вариант №4 в admin.py:
admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
    model = UserProfile

@admin.register(User)
class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline ]

    def save_model(self, request, obj, form, change):
        super(UserProfileAdmin, self).save_model(request, obj, form, change)
        if not change:
            UserProfile.objects.create(user=obj)

Профиль будет создаваться при создании юзера в админке.

А можно и в какой-нибудь специальной view.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DmitryVoronkov
@DmitryVoronkov
Python Developer
self.request.user.userprofile
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы