Может ли Django обрабатывать два последовательных запроса связанных постов? И ввод данных из первого сообщения будет сохранен и использован для второго сообщения
Я пытался создать веб-приложение, которое возвращает калории типа продуктов питания. Я использую API для получения информации и представления ее пользователям. После просмотра результата, если пользователь решит, что он/она хочет сохранить эту информацию о еде в наборе данных для дальнейшего использования, он сохранит ее. Я хочу, чтобы весь этот процесс был завернут в один шаблон и одну основу представления, и я пробовал сделать что-то вроде этого:
Моя модель:
class Ingredient(models.Model):
MEASUREMENT=[('ml','ml'),
('gram','gram')]
name=models.CharField(blank=False, max_length=200)
quantity=models.DecimalField(blank=False, max_digits=8,decimal_places=0,default=100)
measure=models.CharField(blank=False,max_length=4,choices=MEASUREMENT,default='gram')
calories=models.DecimalField(blank=False,null=False,decimal_places=2,max_digits=8,default=0)
def __str__(self):
return self.name
Мои взгляды:
from django.shortcuts import render
from django.http.response import HttpResponseRedirect, HttpResponse
from .models import Ingredient
from .forms import IngredientForm
import requests, json
import requests
import json
api_url = 'https://api.calorieninjas.com/v1/nutrition?query='
def ingredient_form(request):
add=False
kcal=0
if request.method == 'POST':
name=str(request.POST.get('name'))
if Ingredient.objects.filter(name=name).exists():
track=Ingredient.objects.filter(name=name)
add=True
for val in track:
if val.measure==str(request.POST.get('measure')):
add=False
amount=float(request.POST.get('quantity'))
kcal=(amount/float(val.quantity))*float(val.calories)
break
if add==True:
query = str(request.POST.get('quantity')) + ' '+str(request.POST.get('measure'))+' ' + str(request.POST.get('name'))
response = requests.get(api_url + query, headers={'X-Api-Key': 'ZwDpQLeGgrYKVgNd7UE7/Q==ZwxlN5PK4cfBMhua'})
data = response.json()
if len(data['items'])==0:
return HttpResponse('Does not exits')
else:
kcal = float(data['items'][0]['calories'])
else:
add=True
query = str(request.POST.get('quantity')) + ' '+str(request.POST.get('measure'))+' ' + str(request.POST.get('name'))
response = requests.get(api_url + query, headers={'X-Api-Key': 'ZwDpQLeGgrYKVgNd7UE7/Q==ZwxlN5PK4cfBMhua'})
data = response.json()
if len(data['items'])==0:
return HttpResponse('Does not exits')
else:
kcal = float(data['items'][0]['calories'])
if add==True and request.POST.get('subject') == 'yes':
k=kcal/float(request.POST.get('quantity'))*100
form=Ingredient(name=str(request.POST.get('name')),measure=request.POST.get('measure'),calories=k)
form.save()
return render(request, 'nutrition/ingredient.html',{'kcal':kcal,'add':add})
else:
return render(request, 'nutrition/ingredient.html',{'kcal':kcal,'add':add})
Мой шаблон (nutrition/ingredient.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Ingredient-Add</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
<label for="fname">Name:</label><br>
<input type="text" id="fname" name="name"><br>
{% csrf_token %}
<label for="lname">Quantity:</label><br>
<input type="text" id="lname" name="quantity">
{% csrf_token %}
<p>Please select the measurement:</p>
<input type="radio" id="gram" name="measure" value="gram">
<label for="gram">Gram</label><br>
<input type="radio" id="ml" name="measure" value="ml">
<label for="ml">ML</label><br>
<br>
<br>
<button class=" btn btn-outline-secondary " type="submit" name='form'>Submit</button>
</form>
{% if kcal %}
kcal: {{kcal}}
{% endif %}
<br>
<br>
{% if add == True %}
Do you want to add this ingredient to your dataset?
<input class='btn btn-primary' name="subject" type="submit" value="yes">Yes</button>
<input class='btn btn-primary' name="subject" type="submit" value="no">No</button>
{% endif %}
</body>
</html>
Я знаю, что функция просмотра и шаблон вполне достигли того, что я пытался сделать, но я не знаю, как это исправить. Не могли бы вы быть настолько любезны, чтобы показать мне как? Заранее спасибо!