4

私のDjangoモデル、Dishes and Likesには次のテーブルがあります。私のホームページでは、データベース内のすべての料理のリストを表示しており、各料理に「いいね」ボタンがあります。ユーザーが気に入った料理の場合は、既に気に入っていることを示して、気に入らなかったり、その逆もできるようにしたいと考えています。ここ数日、さまざまなアプローチを試みてきましたが、何も理解できないようです。これが私の最近の失敗した試みのコードです。

#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, })
4

2 に答える 2

2

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常にビューから渡されるようになります。

于 2013-09-09T04:40:06.257 に答える
0

新しいモデルが必要で、django User モデルを使用していると仮定すると、次のようなものになる可能性があります。

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

ビュー.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)
于 2013-09-09T04:38:49.040 に答える