Adding ManyToMany solves this problem:
class Dishes(models.Model): name = models.CharField(max_length=40, unique=True) likes = models.ManyToManyField(Likes) class Likes(models.Model): dish = models.ForeignKey(Dishes) user = models.ForeignKey(User) date_added = models.DateTimeField(auto_now_add=True)
Adjust your presentation as follows:
from django.contrib.auth.decorators import login_required from django.shortcuts import render @login_required def home(request): dishes = Dishes.objects.all() return_list = [] for dish in dishes: return_list.append((dish, dish.likes_set.filter(user=request.user))) return render(request, 'dish_list.html', {'dishes': return_list})
Your template uses a "switch":
{% for dish, liked in dishes %} {{ dish.name }} {% if liked %} You already like this dish. {% else %} Like this dish now, its yummy! {% endif %} {% endfor %}
Or, if you cannot change your model, edit your view code as follows:
@login_required def home(request): dishes = Dishes.objects.all() return_list = [] for dish in dishes: return_list.append((dish, Likes.objects.filter(user=request.user, dish=dish))) return render(request, 'dish_list.html', {'dishes': return_list})
The idea is that the list of objects that you return to the template is already marked for the user who is logged in.
login_required
decorator ensures that the view is called only when the user logs in. Otherwise, it redirects the user to the login page.
render
shortcut ensures that RequestContext
always passed from your views.