在我的第一个应用程序(一种可以创建用餐计划的烹饪书(上工作时,我遇到了在html模板中添加一个从多到多(直通(模型的问题。RecipeMealPlan模型中的字段名称为"mean"。
以下是我的型号:
class Recipe(models.Model):
title = models.CharField(max_length=50)
cooking_time = models.IntegerField(help_text='in minutes', validators=[MinValueValidator(1), MaxValueValidator(5000)])
difficulty_level = models.IntegerField(choices=DIFFICULTY_LEVELS, default=1)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
cuisine = models.ForeignKey('Cuisine', on_delete=models.CASCADE, null=True)
ingredient = models.ManyToManyField(Ingredient, through='IngredientRecipe')
meal_plan = models.ManyToManyField('MealPlan', through='RecipeMealPlan')
class RecipeMealPlan(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
meal_plan = models.ForeignKey('MealPlan', on_delete=models.CASCADE)
meal = models.IntegerField(choices=MEALS)
MEALS = (
(1, 'Breakfast'),
(2, '2nd breakfast'),
(3, 'Lunch'),
(4, 'Snack'),
(5, 'Dinner')
)
class MealPlan(models.Model):
name = models.CharField(max_length=50)
amount = models.IntegerField(validators=[MinValueValidator(4), MaxValueValidator(6)])
这是我创建的视图,用于在我的应用程序上显示用餐计划的详细信息:
class MealPlanDetailsView(View):
def get(self, request, id):
mealplan = MealPlan.objects.get(id=id)
recipes = mealplan.recipe_set.all()
return render(request, 'diet_app/mealplan_details.html', {'mealplan': mealplan, 'recipes': recipes})
和html模板:
{% extends 'diet_app/base.html' %}
{% block title %}{{ mealplan|upper }}{% endblock %}
{% block content %}
<h2>{{ mealplan|upper }}</h2>
<ul> <p>Posiłki:</p>
{% for recipe in mealplan.recipemealplan_set.all %}
<li>{{ recipe.get_meal_display}}: <a href="/recipe/{{recipe.id}}/">{{ recipe }}</a></li>
{% endfor %}
</ul>
{% endblock %}
一切看起来都很好,但与收据详细信息的链接不起作用:
<a href="/recipe/{{recipe.id}}/">
如果我写这样的循环链接工作:
{% for recipe in recipes %}
<li><a href="/recipe/{{recipe.id}}/">{{ recipe.title }} </a></li>
{% endfor %}
但我看不到食谱之前的餐名(餐名的意思是早餐、晚餐等(。我不知道如何把它写下来,把餐名和食谱连同食谱细节的链接一起看。
只有当我把这两个循环写在一起时,我才成功,但后来我看到我的用餐计划重复了几次。
有什么想法吗?我该怎么做才能让它按我想要的方式工作?
recipe.id
是直通模型RecipeMealPlan
的id,而不是Recipe
,因此需要使用recipe.id
而不是recipe.recipe.id
。
同样为了理智起见,您可以使用类似recipemealplan
而不是recipe
的东西作为变量名,因此:
{% for recipemealplan in mealplan.recipemealplan_set.all %}
<li>{{ recipemealplan.get_meal_display}}: <a href="/recipe/{{ recipemealplan.recipe.id }}/">{{ recipemealplan }}</a></li>
{% endfor %}