こんにちは、Python, Djangoビギナーの者です。
この度ウェブアプリケーションを作っているのですが、そこで複数の四則演算を実装したいと思っています。
models.py
1from django.db import models 2from django.contrib.auth.models import User 3from django.core.validators import MaxValueValidator, MinValueValidator 4# Create your models here. 5class Food(models.Model): 6 user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) 7 name = models.CharField(max_length=200) 8 kcal = models.PositiveSmallIntegerField() 9 protein = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)]) 10 fat = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)]) 11 carb = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)]) 12 description = models.TextField(null=True, blank=True) 13 eaten_date = models.DateField(editable=True, blank=True, null=True) 14 created = models.DateTimeField(auto_now_add=True) 15 16 def __str__(self): 17 return self.name
views.py
1from django.shortcuts import render 2from .models import Food 3from django.views.generic.list import ListView 4from django.views.generic.edit import CreateView, UpdateView, DeleteView 5# Create your views here. 6import datetime 7from django.db.models import Sum 8def foods(request): 9 today = datetime.datetime.today() 10 foods = Food.objects.filter(eaten_date=today) 11 kcal = foods.aggregate(Sum('kcal')) 12 #合計キロカロリー 13 kcal_list = [food['kcal'] for food in foods.values('kcal')] 14 ttl_kcal = sum(kcal_list) 15 # total_protein 16 protein_list = [food['protein'] for food in foods.values('protein')] 17 ttl_protein = sum(protein_list) 18 #合計キロカロリー 19 fat_list = [food['fat'] for food in foods.values('fat')] 20 ttl_fat = sum(fat_list) 21 #合計キロカロリー 22 carb_list = [food['carb'] for food in foods.values('carb')] 23 ttl_carb = sum(carb_list) 24 25 context = { 26 'foods': foods, 27 'ttl_kcal': ttl_kcal, 28 'ttl_protein': ttl_protein, 29 'ttl_fat': ttl_fat, 30 'ttl_carb': ttl_carb, 31 'kcal': kcal, 32 } 33 return render(request, 'base/foods.html', context) 34 35# class FoodList(ListView): 36# model = Food 37# template_name = 'base/foods.html' 38# # html内で使う変数名をobject_listから任意名に変更 39# context_object_name = 'foods' 40# def get_context_data(self, **kwargs): 41# context = super().get_context_data(**kwargs) 42# context['foods'] = [food['kcal'] for food in Food.objects.values('kcal')] 43# context['total_total'] = sum(context['foods']) 44# return context 45 # def get_context_data(self, **kwargs): 46 # context = super().get_context_data(**kwargs) 47 # context['food'] = 'pancake' 48 # return context 49 50from django.urls import reverse_lazy 51class FoodCreate(CreateView): 52 template_name = 'base/create.html' 53 model = Food 54 fields = '__all__' 55 success_url = reverse_lazy('foods') 56 57 58class FoodUpdate(UpdateView): 59 template_name = 'base/update.html' 60 model = Food 61 fields = '__all__' 62 success_url = reverse_lazy('foods') 63 64class FoodDelete(DeleteView): 65 template_name = 'base/delete.html' 66 model = Food 67 context_object_name = 'food' 68 success_url = reverse_lazy('foods') 69
foods.html
1<h1>今日食べたもの</h1> 2<p>本日は{% now "F" %}{% now "j" %}日({% now "l" %})です</p> 3<a href="{% url 'create' %}">追加</a> 4 5<table> 6 <tr> 7 <th>食べもの</th> 8 <th>カロリー</th> 9 <th>タンパク質</th> 10 <th>脂質</th> 11 <th>炭水化物</th> 12 <th>日付</th> 13 </tr> 14 15 {% for food in foods %} 16 <tr> 17 <td>{{ food.name }}</td> 18 <td>{{ food.kcal }}</td> 19 <td>{{ food.protein }}</td> 20 <td>{{ food.fat }}</td> 21 <td>{{ food.carb }}</td> 22 <td>{{ food.eaten_date }}</td> 23 <td><a href="{% url 'update' food.id %}">編集</a></td> 24 <td><a href="{% url 'delete' food.id %}">削除</a></td> 25 </tr> 26 {% empty %} 27 <h4>No itmes</h4> 28 {% endfor %} 29 <tr> 30 <th>合計</th> 31 <th>{{ ttl_kcal }}</th> 32 <th>{{ ttl_protein }}</th> 33 <th>{{ ttl_fat }}</th> 34 <th>{{ ttl_carb }}</th> 35 </tr> 36</table> 37
やりたい計算といたしましては、(protein + carb)4 + fat9 をカロリーとしてその食事のDBに保存、html上に表示させたいです。現在は新規追加からフォームにカロリーを手入力しています。なので、フォームではprotein, fat, carbなどのkcal以外を打ち込めれる感じにしたいです。この計算をviewsでするのか、html上で行うのか、やり方をご教授していただけるとありがたいです。
自分で調べたところ、アプリ直下にtemplatestagファイルを作り、その中にutils.pyを作り、そこにコードを書くと言われていました。ですが、四則演算の仕方がどうにもわからないので、手が止まっています。
ご協力していただける方、よろしくお願いします。
あなたの回答
tips
プレビュー