🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1822閲覧

Djangoでモデル同士の計算

kei_ino

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/02/15 08:18

前提・実現したいこと

※Python初学者ですので伝わりづらい点もあるかもしれませんがよろしくお願いします。

1.NewPointView関数内でformを使って、新しいポイントを作成。
2.作成したpointと同じnameのCustomUserのtotal_pointを増加させたいと思っています。
view.pyの中に customuser.total_point += point.num
を作成したのですが、total_pointには全く反応がありません。
total_pointを増加させるために修正すべき点を教えていただけますと幸いです。よろしくお願いします。

該当のソースコード

# app/views.py from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from django.contrib.auth.decorators import login_required from .models import CustomUser, Point, Text from .forms import NewPointForm @login_required def point_new(request): if request.method == "POST": form = NewPointForm(request.POST) if form.is_valid(): point = form.save() customuser = get_ object_or_404(CustomUser, username = point.name) customuser.total_point += point.num messages.success(request, "ポイントを作成しました!") return redirect('app:modify') else: form = NewPointForm() return render(request, 'app/modify.html', {'form': form})
# app/models.py from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): """拡張ユーザーモデル""" class Meta: db_table = "custom_user" total_point = models.PositiveIntegerField(verbose_name='ポイント', default=0) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.username class Text(models.Model): text = models.CharField(max_length=100) def __str__(self): return self.text class Point(models.Model): num = models.PositiveIntegerField(verbose_name='ポイント', default=0) created_at = models.DateTimeField(auto_now=True) name = models.ForeignKey(CustomUser, on_delete=models.PROTECT) text = models.ForeignKey(Text, on_delete=models.PROTECT)
# app/forms.py from django import forms from django.forms import ModelForm from .models import Point class NewPointForm(ModelForm): class Meta: model = Point fields = ['num', 'name', 'text']
# app/urls.py from django.urls import path from . import views app_name = 'app' urlpatterns = [ path('modify/', views.point_new, name='modify'), ]
# config/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('app.urls')) ]
# app/modify.html {% extends 'app/base.html' %} {% block content %} {% if request.user.is_authenticated %} <h2>管理画面</h2> <form action="{% url 'app:modify' %}" method="POST"> {% csrf_token %} <table> <tr> <th>ポイント</th> <td>{{ form.num }}</td> </tr> <tr> <th>名前</th> <td>{{ form.name }}</td> </tr> <tr> <th>内容</th> <td>{{ form.text }}</td> </table> <button type="submit" class="btn">保存</button> {% endif %} {% endblock %}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

app/views.pypoint_new()内の処理で、customuser.total_pointは増加しています。
(増やしている処理の前後でprint文にて確認できます)

期待している動作は、total_pointを**『データベースに保存すること』**と思われますので、
ポイント加算後にcustomuser.save()を実行してデータベースへの保存を行うのが良いかと思います。

投稿2021/02/15 11:40

takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei_ino

2021/02/15 16:41

質問の意図を的確に汲んでいただいてありがとうございます! 期待した通り実行されました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問