Профиль пользователя не существует у пользователя нет профиля

Для приложения кошелька я создал профиль для каждого пользователя модели пользователя django.contrib.auth.models. когда пользователь создает учетную запись, его профиль создается и сохраняется. Но когда я пытаюсь добавить деньги, я получаю сообщение об ошибке «Профиль пользователя не существует, у пользователя нет профиля». Итак, я проверил базу данных и их профиль пользователя с правильным пользователем. Я действительно смущен тем, почему это происходит.

//просмотр add_money

def add_money(request):
    if request.user:
        if request.user.has_perm('add_money'):
            if request.POST and request.POST.get('amount'):
                username = request.user.username
                add_amount = request.POST.get('amount')
                wallet = Wallet.objects.get(pk=request.user.userprofile.wallet_id_id)
                wallet.add_money(add_amount)
                wallet.save()
                now = datetime.now()
                trans = Transaction(from_name=username, wallet_id=wallet, date=now, amount=add_amount)
                trans.save()
                return render(request, 'user_profile.html', {'user': request.user,'userprofile': request.user.userprofile, 'wallet': wallet})
            else:
                return render(request, 'add_money.html')
        else:
            return render(request, 'access_denied.html')
    else:
        return HttpResponseRedirect('/login/?next={}'.format('/add_money/'))

//создать_пользовательское представление

def create_user(request):
    form = UserReg(request.POST or None)
    if form.is_valid():
        user = form.save(commit=False)
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user.set_password(password)
        wallet = Wallet(username=request.POST['username'], amount=0)
        wallet.save()
        user.save()
        userprofile = Userprofile(user=user, wallet_id=wallet)
        userprofile.save()
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return render(request, 'user_profile.html', {'user': user, 'wallet': wallet})
    context = {
        "form": form,
    }
    return render(request, 'create_user.html',context)

//Модель профиля пользователя

class Userprofile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True)
    wallet_id = models.ForeignKey(Wallet, on_delete=models.CASCADE)
    date_ob = models.DateField(null=True, blank=True)
    sex = models.CharField(max_length=1, null=True)

    def __str__(self):
        return self.user

Образ базы данных Образ базы данных Трассировка:

File "/Users/ravinkohli/env_app_pw/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/ravinkohli/PycharmProjects/untitled1/wallet/views.py" in add_money
  19.                 wallet = Wallet.objects.get(pk=request.user.userprofile.wallet_id_id)
File "/Users/ravinkohli/env_app_pw/lib/python2.7/site-packages/django/utils/functional.py" in inner
  226.         return func(self._wrapped, *args)
File "/Users/ravinkohli/env_app_pw/lib/python2.7/site-packages/django/db/models/fields/related.py" in __get__
  480.                     self.related.get_accessor_name()

Exception Type: RelatedObjectDoesNotExist at /add_money/
Exception Value: User has no userprofile.

**РЕДАКТИРОВАТЬ:

проблема была решена, когда я вышел из административного сайта на другой вкладке, я напечатал request.user.username, и отобразилось имя пользователя администратора, это было решено, когда я вышел из системы. Спасибо за вашу помощь**


person Ravin Kohli    schedule 16.12.2016    source источник
comment
Почему пользователь является первичным ключом?   -  person Sayse    schedule 16.12.2016
comment
могу ли я предложить пометить ответ как правильный, спасибо   -  person e4c5    schedule 19.12.2016


Ответы (1)


Решение этой проблемы.

Ошибка возникает в этой строке

 wallet = Wallet.objects.get(pk=request.user.userprofile.wallet_id_id)

Очевидно, потому что для пользователя не существует профиля пользователя. Это может быть по двум основным причинам.

  1. пользователь является анонимным пользователем (не аутентифицированным), вы не проверяете, вошел ли пользователь в систему
  2. учетная запись пользователя была создана до того, как вы создали профиль пользователя.

сначала проверьте, существует ли профиль

if not getattr(request.user,'userprofile'):
    # create user profile here

wallet = Wallet.objects.get(pk=request.user.userprofile.wallet_id_id)

Настоящее решение

У вас неправильный дизайн базы данных. Видеть это.

wallet = Wallet(username=request.POST['username'], amount=0)

Это означает, что у вас есть поле имени пользователя в вашей модели кошелька, но затем

class Userprofile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True)
    wallet_id = models.ForeignKey(Wallet, on_delete=models.CASCADE)

У вас есть кошелек в качестве внешнего ключа для профиля пользователя, что приводит к циклическим отношениям.

Правильным дизайном было бы удалить поле имени пользователя из вашего кошелька и заменить его полем пользователя.

class Wallet(models.Model):
    user = models.ForeignKey(User)
    ...

Тогда ваш профиль пользователя станет

class Userprofile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True)
    date_ob = models.DateField(null=True, blank=True)
    sex = models.CharField(max_length=1, null=True)

    def __str__(self):
        return self.user
person e4c5    schedule 16.12.2016
comment
Поскольку исключение Exception Value: User has no userprofile., мы можем предположить, что это не объект anonymous User. - person itzMEonTV; 16.12.2016
comment
привет @itzmeontv как мы можем прийти к такому выводу? анонимный пользователь также не имеет профиля пользователя - person e4c5; 16.12.2016
comment
request.user никогда не возвращает объект User, если вы не вошли в систему. AnonymousUser не является классом User - person itzMEonTV; 16.12.2016
comment
ах да @itzmeontv различие между U и U, которое я, кажется, пропустил - person e4c5; 16.12.2016
comment
проблема была решена, когда я вышел из административного сайта на другой вкладке, я напечатал request.user.username, и отобразилось имя пользователя администратора, это было решено, когда я вышел из системы. Спасибо за вашу помощь - person Ravin Kohli; 16.12.2016
comment
так что, как я догадался, это потому, что эта учетная запись (admin) была создана до того, как вы добавили модель профиля. Кстати, не могли бы вы отметить ответ как правильный. - person e4c5; 16.12.2016