ウォレットアプリの場合 のプロファイルを作成しましたdjango.contrib.auth.modelsユーザーモデルのすべてのユーザー。ユーザーがアカウントを作成すると、プロファイルが作成されて保存されます。しかし、お金を追加しようとすると、Userprofileが存在しないというエラーが表示されます。userにはプロファイルがありません。だから私はデータベースをチェックし、正しいユーザーのユーザープロファイルが存在します。なぜこれが起こっているのか、私は本当に混乱しています。
// 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/"))
// create_userビュー
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を印刷すると、管理者のユーザー名が表示されました。これは、ログアウトしたときに解決されました。ご協力いただきありがとうございます**
回答:
回答№1は1この問題の解決策。
この行でエラーが発生します
wallet = Wallet.objects.get(pk=request.user.userprofile.wallet_id_id)
明らかに、ユーザーのユーザープロファイルが存在しないためです。これには、主に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)
循環関係につながるUserProfileへの外部キーとしてウォレットがあります。
正しい設計は、ウォレットからユーザー名フィールドを削除し、それをユーザーフィールドに置き換えることです。
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