如何显示用户是否已经喜欢 Django 中的对象实例



我的 Django 模型中有下表,菜肴和喜欢。在我的主页上,我显示了数据库中所有菜肴的列表,并且每道菜上都有一个喜欢按钮。对于用户喜欢的菜肴,我想表明他们已经喜欢它,以便他们可以不喜欢它,反之亦然。在过去的几天里,我一直在尝试不同的方法,但似乎什么也想不通。这是我最近一次失败尝试的代码。

#dishes table
class Dishes(models.Model):
    name = models.CharField(max_length=40, unique=True)
    def liked(dish, user):
        try:
            user_upvoted = Likes.objects.get(dish=dish, user=user)
        except:
            user_upvoted = None
        if user_upvoted:
            return True
        else:
            return False

#upvotes
class Likes(models.Model):
    dish = models.ForeignKey(Dishes)
    user = models.ForeignKey(User)
    date_added = models.DateTimeField(auto_now_add=True)
def home(request):
    this_user = auth.models.User.objects.get(id=1)
    dishes = models.Dishes.objects.all()
    for dish in dishes:
         models.Dishes.voted(dish, this_user)
    `enter code here`return render_to_response('frontend/home.html', { 'dishes': dishes, })

添加 ManyToMany 使这个问题变得容易解决:

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)

像这样调整视图:

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

您的模板是您执行"切换"的地方:

 {% for dish, liked in dishes %}
     {{ dish.name }}
     {% if liked %}
          You already like this dish.
     {% else %}
          Like this dish now, its yummy!
     {% endif %}
  {% endfor %}

或者,如果您无法更改模型,请按如下所示调整视图代码:

@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})

这个想法是,您返回到模板的对象列表已经为登录的用户标记。

login_required修饰器确保仅在用户登录时调用视图。否则,它会将用户重定向到登录页面。

render快捷方式将确保始终从视图中传递RequestContext

你需要一个新的模型,假设你使用的是 django 用户模型,你可以有这样的东西:

models.py

from django.contrib.auth.models import User
class DishLiked(models.Model):
    dish = models.ForeignKey(Dish,
        related_name='liked_by'
    )
    like = models.ForeignKey(Like,
        related_name='like_by'
    )
    user = models.ForeignKey(User,
        related_name='liked_dishes'
    )

views.py

注意

:还要注意他们从request获取用户的方式:

def home(request):
    user = request.user
    liked = DishLiked.objects.filter(
        user__id=user.id
    )
    dish_id_list = []
    for liked_dish on liked:
        dish_id_list.append(liked_dish.dish.pk)
    dishes_liked_by_user = Dish.objects.filter(id__in=dish_id_list)

最新更新