Django: POST и GET запросы и рендеринг на шаблоне
Возможно, я потерялся в стакане воды, но в данный момент я не могу разобраться. Я работаю над проектом по созданию ресторана, где клиент может видеть страницу меню, страницу покупки и владелец ресторана после входа в систему может управлять и вводить новый рецепт и создавать свое личное меню. Я пытаюсь сделать следующее: когда владелец ресторана отправляет POST запрос, в котором он вводит рецепт, я хочу, чтобы рецепт появился также на странице, где находится меню. Таким образом можно обновить новый рецепт и изменить старый. (Я копирую код модели, формы и представления для полного обзора):
form.py
class RecipeForm(forms.ModelForm):
class Meta:
model = Recipe
fields = '__all__'
model.py
class Recipe(models.Model):
name = models.CharField(max_length=50)
ingredients = models.CharField(max_length=500)
def __str__(self):
return self.name
View.py
def recipeEntry(request):
recipe_menu = Recipe.objects.all()
form = RecipeForm()
if request.method == 'POST':
form = RecipeForm(request.POST)
if form.is_valid():
form.save()
return redirect("recipe")
context = {'form':form, 'recipe_menu':recipe_menu}
return render(request, 'inventory/recipe.html', context)
recipe.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Recipe</title>
</head>
<body>
<form method="post", action="">{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Add Recipe">
</form>
{% for rec in recipe_menu %}
<div>
<p>Recipe: {{rec.name}}</p>
<p>Ingredient :{{rec.ingredients}}</p>
</div>
{% endfor %}
</body>
</html>
На данный момент часть отправки POST-запроса работает, не работает только вторая часть. Я попробовал несколько решений, но я не понимаю, что делать. Я думал также создать GET представление для страницы меню, но мне нужно передать URL для получения данных, и у меня ничего не получилось.
Большое спасибо за помощь.
Вы должны попытаться явно создать пустую форму, когда это не пост-запрос :
def recipeEntry(request):
recipe_menu = Recipe.objects.all()
# form = RecipeForm() Not here yet
if request.method == 'POST':
# Instantiate form with request.POST
form = RecipeForm(request.POST)
if form.is_valid():
form.save()
return redirect("recipe")
else: # Explicitly write else block
# Instantiate empty form for get request
form = RecipeForm()
context = {'form':form, 'recipe_menu':recipe_menu}
return render(request, 'inventory/recipe.html', context)