Проблема с отображением поля ManyToMany в шаблонах Dango

У меня есть приложение для списка покупок, и я хочу отобразить значения из моих ингредиентов ManyToManyField, но вместо этого я получаю название рецепта, который я создал.

Посоветуйте, пожалуйста, как правильно это сделать?

models.py

class Ingredients(models.Model):
    name=models.CharField(max_length=100, default='-', blank=True, unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'składnik'
        verbose_name_plural = 'składniki'

    def __str__(self):
        return str(self.name)


class Category(models.Model):
    name=models.CharField(max_length=250, default='-', blank=True, unique=True)
    slug = models.SlugField(unique=True, blank=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'kategoria'
        verbose_name_plural = 'kategorie'
    
    def get_absolute_url(self):
        return reverse("kategoria", kwargs={"slug": self.slug})
    
    def __str__(self):
        return str(self.name)
    

class Recipe(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, default='-')
    name = models.CharField(max_length=400, blank=False, unique=False)
    body = models.TextField(blank=True, default='')
    ingredients = models.ManyToManyField(Ingredients)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True)
    date_created = models.DateTimeField('Utworzono', default=timezone.now)
    last_updated = models.DateTimeField('Ostatnia zmiana',auto_now=True)
    when_to_eat = models.DateField('Kalendarz', default=timezone.now)
    tags = TaggableManager()
    slug = models.SlugField(unique=True, blank=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'przepis'
        verbose_name_plural = 'przepisy'

    
    def get_absolute_url(self):
        return reverse("przepis", kwargs={"slug": self.slug})
    
    def __str__(self):
        return str(self.name)

views.py

class RecipeListView(ListView):
    model = Recipe
    template_name ='recipe_list.html'
    queryset = Recipe.objects.all()

urls.py

urlpatterns = [
    path('przepisy/', views.RecipeListView.as_view(), name='recipe_list'),
    path('przepis/<slug:slug>/', views.RecipeDetailView.as_view(), name='przepis'),
]

recipe_list.html

 <p class="card-text">Składniki:<br>
      {% for ingredient in object_list %}
          <li>{{ingredient.name}}</li>
      {% endfor %}
 </p>

вам следует попробовать что-то вроде этого:

{% for ingredients in object_list %}
{% for ingredient in ingredients.name.all %}
  <li>{{ingredient.name}}</li>
{% endfor %}
{% endfor %}

Попробуйте это:

 <p class="card-text">Składniki:<br>
      {% for recipe in object_list %}
            {% for ingredient in recipe.ingredients.all %}
               <li>{{ingredient.name}}</li>
            {% endfor %}
      {% endfor %}
 </p>

Поскольку вы хотите получить все названия из вашей модели Ingredients, но вы используете {{ingredient.name}}, который покажет вам все названия из вашей модели Recipe. Вам нужно написать {{ingredient.ingredients.name}} Таким образом, код будет выглядеть следующим образом

 <p class="card-text">Składniki:<br>
      {% for ingredient in object_list %}
          <li>{{ingredient.ingredients.name}}</li>
      {% endfor %}
 </p>

Так как вы используете модель Recipe в вашем ListView, поэтому, когда вы пишете {{ingredient.name}}, это похоже на это Recipe Model > name когда мы пишем {{ingredient.ingredients.name}}, это похоже на Recipe Model > ManyToManyField of ingredients > garbing name from Ingredients model

Вернуться на верх