django查看多对多关系字段问题

django views many-to-many relationship field problem

在我的第一个应用程序(一种烹饪书,它也可以创建膳食计划)工作期间,我遇到了一个问题,无法将一个字段从多对多(通过)模型添加到我的 html 模板。 RecipeMealPlan 模型中的字段名称是 'meal'。

这是我的模型:

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 %}

一切看起来都很好,但是 link 接收详细信息不起作用:

<a href="/recipe/{{recipe.id}}/">

Link 如果我这样写循环就可以工作:

{% for recipe in recipes %}
<li><a href="/recipe/{{recipe.id}}/">{{ recipe.title }} </a></li>
{% endfor %}

但是我在菜谱前没有看到餐名(餐名表示早餐、晚餐等)。不知道怎么写下来一起看菜名和菜谱link菜谱详情

只有当我将这 2 个循环组合在一起时我才成功,但后来我看到我的膳食计划重复了几次。

有什么想法可以使它按我想要的方式工作吗?

recipe.id是through模型的idRecipeMealPlan,不是Recipe,所以要用recipe.recipe.id代替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 %}