Home > Net >  problem with displaying ManyToMany Field in Dango templates
problem with displaying ManyToMany Field in Dango templates

Time:01-10

I have an app that for shopping list and I want to display values from my ingredients ManyToManyField but what I am getting instead is the name of the recipe that I created.

Could you please advice me on how to correctly do it?

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 >Składniki:<br>
      {% for ingredient in object_list %}
          <li>{{ingredient.name}}</li>
      {% endfor %}
 </p>

CodePudding user response:

you should try something like this:

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

CodePudding user response:

Try this:

 <p >Składniki:<br>
      {% for recipe in object_list %}
            {% for ingredient in recipe.ingredients.all %}
               <li>{{ingredient.name}}</li>
            {% endfor %}
      {% endfor %}
 </p>

CodePudding user response:

As you want to get all name from your Ingredients model but you are using {{ingredient.name}} which will show you all name from your Recipe Model. You need to be write {{ingredient.ingredients.name}} So the code will be looke like this

 <p >Składniki:<br>
      {% for ingredient in object_list %}
          <li>{{ingredient.ingredients.name}}</li>
      {% endfor %}
 </p>

As you are using Recipe model in your ListView so when you are writing {{ingredient.name}} it's similar to like this Recipe Model > name when we are writing {{ingredient.ingredients.name}} it's similar to Recipe Model > ManyToManyField of ingredients > garbing name from Ingredients model

  •  Tags:  
  • Related