在我用flask和sqlite制作了一个项目后,我想用django制作它,我成功地在特定日期添加了食物
并计算总卡路里,但我无法在主页中显示总卡路里的天数,我只显示我添加到模型中的天数,但无法显示总蛋白质、脂肪和卡路里的详细信息,所以我想要
我认为create_date函数的解决方案
这是我的项目详细信息
首先是我的模型
from django.db import models
from datetime import datetime
# Create your models here.
class Food(models.Model):
name=models.CharField(max_length=512,unique=True)
protein=models.IntegerField(null=False)
carbohydrates=models.IntegerField(null=False)
fats=models.IntegerField(null=False)
calories=models.IntegerField(null=True)
def total_calories_food(self):
total=self.protein * 4 + self.carbohydrates * 4 + self.fats * 9
self.calories=total
self.save()
def __str__(self):
return f'{self.name}'
class Dates(models.Model):
food=models.ManyToManyField(Food,through='DatesFoods')
date=models.DateField()
class DatesFoods(models.Model):
date_id=models.ForeignKey(Dates,on_delete=models.CASCADE)
food_id=models.ForeignKey(Food,on_delete=models.CASCADE)
second my forms:
from django import forms
from .models import Food, Dates
class Food_Form(forms.ModelForm):
class Meta():
model = Food
fields = ('name', 'protein', 'carbohydrates', 'fats')
class Dates_Form(forms.ModelForm):
class Meta():
model = Dates
fields = ('date',)
and finally my views
def create_date(request):
form=Dates_Form(request.POST)
dates = Dates.objects.all()
if form.is_valid():
form.save()
return render(request,'foodlist/home.html',context={'form':form,'dates':dates,
})
def add_food(request):
form=Food_Form(request.POST)
if form.is_valid():
form.save()
foods=Food.objects.all()
for d in foods:
d.total_calories_food()
return render(request,'foodlist/add_food.html',context={'form':form,'foods':foods})
def view_foods_day(request,date):
d=get_object_or_404(Dates,date=date)
print(d)
foods=Food.objects.all()
foods_day=DatesFoods.objects.filter(date_id=d.id)
protein=[]
fats=[]
carbohydrates=[]
calories=[]
for i in foods_day:
protein.append(i.food_id.protein)
fats.append(i.food_id.fats)
carbohydrates.append(i.food_id.carbohydrates)
calories.append(i.food_id.calories)
if request.method=='POST':
food_w=request.POST.get('food-select')
f=Food.objects.get(pk=food_w)
DatesFoods.objects.create(date_id=d,food_id=f)
return render(request,'foodlist/day.html', context={'foods':foods,'date':d.date,
'protein':sum(protein),
'fats':sum(fats),
'carbohydrates':sum(carbohydrates),
'calories':sum(calories),
'foods_day':foods_day})
我尝试展示所有日子的蛋白质、脂肪、碳水化合物的详细信息(以克为单位)和总热量
我成功显示了特定日期的详细信息,但未能显示所有日期的详细信息
这是一个涉及更新视图以传递总营养详细信息的解决方案。
def create_date(request):
form = Dates_Form(request.POST or None)
if form.is_valid():
form.save()
dates_with_totals = []
dates = Dates.objects.all()
for date in dates:
foods_day = DatesFoods.objects.filter(date_id=date.id)
total_protein = foods_day.aggregate(Sum('food_id__protein'))['food_id__protein__sum'] or 0
total_fats = foods_day.aggregate(Sum('food_id__fats'))['food_id__fats__sum'] or 0
total_carbohydrates = foods_day.aggregate(Sum('food_id__carbohydrates'))['food_id__carbohydrates__sum'] or 0
total_calories = foods_day.aggregate(Sum('food_id__calories'))['food_id__calories__sum'] or 0
dates_with_totals.append({
'date': date,
'total_protein': total_protein,
'total_fats': total_fats,
'total_carbohydrates': total_carbohydrates,
'total_calories': total_calories
})
return render(request, 'foodlist/home.html', context={
'form': form,
'dates_with_totals': dates_with_totals,
})
希望这对你有一点帮助。