Как заставить мою кнопку «Мне нравится» в Django работать? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь заставить мою кнопку «Мне нравится» работать на моем сайте.Вы можете делать "твиты" на моем сайте, но пользователям не нравится публикация.Я уже настроил интерфейс с помощью AJAX.это работает отлично.Проблема заключается в моих взглядах.

Вот мои модели

    class Tweet(models.Model):
    tweet_user = models.ForeignKey(User, on_delete=models.CASCADE)
    tweet_message = models.TextField()
    tweet_date = models.DateTimeField(auto_now_add=True)
    tweet_like_counter = models.IntegerField(default=0)
    tweet_picture = models.FileField(null=True,blank=True)


    def __str__(self):
        return self.tweet_message


class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    tweet = models.ForeignKey(Tweet, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.tweet.tweet_message

class Disike(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    tweet = models.ForeignKey(Tweet, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.tweet.tweet_message


class TweetComment(models.Model):
    class Meta:
        ordering = ['-id']

    tweetcomment = models.ForeignKey(Tweet, on_delete=models.CASCADE, related_name='tweetcomments')
    tweetcommentauthor = models.ForeignKey(User,on_delete=models.CASCADE)
    tweetcommentmessage = models.TextField()
    tweetcommentcomment_date_created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.tweetcommentmessage

Вот мои взгляды

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@login_required
def like(request, pk):


    currentTweet = get_object_or_404(Tweet,pk=pk)
    user = User.objects.get(pk=request.user.id)
    like = Like.objects.create(tweet=currentTweet, user=user)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)
    dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=user)






    if like_queryset.exists():
        Like.objects.filter(tweet=currentTweet, user=user).delete()
        dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
        likeobject = Like.objects.filter(tweet=currentTweet).count()
        currentTweet.tweet_like_counter = likeobject - dislikeobject
        currentTweet.save()

    if  dislike_queryset.exists():
        Disike.objects.filter(tweet=currentTweet, user=user).delete()
        dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
        likeobject = Like.objects.filter(tweet=currentTweet).count()
        currentTweet.tweet_like_counter = likeobject - dislikeobject
        currentTweet.save()





    return JsonResponse({
        'like_counter': currentTweet.tweet_like_counter


    })




@csrf_exempt
@login_required
def dislike(request, pk):
    currentTweet = get_object_or_404(Tweet, pk=pk)
    user = User.objects.get(pk=request.user.id)
    dislike = Disike.objects.create(tweet=currentTweet, user=user)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)
    dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=user)


    if dislike_queryset.exists():
        Disike.objects.filter(tweet=currentTweet, user=user).delete()
        dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
        likeobject = Like.objects.filter(tweet=currentTweet).count()
        currentTweet.tweet_like_counter = likeobject - dislikeobject
        currentTweet.save()

    if like_queryset.exists():
        Like.objects.filter(tweet=currentTweet, user=user).delete()
        dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
        likeobject = Like.objects.filter(tweet=currentTweet).count()
        currentTweet.tweet_like_counter = likeobject - dislikeobject
        currentTweet.save()








    return JsonResponse({
        'like_counter':  currentTweet.tweet_like_counter

    })

Я не знаю, что еще делать.Когда я запускаю этот код, я не получаю ошибок, но когда я нажимаю кнопку «Мне нравится», не создается похожий объект ...

НО, когда я использую этот код в представлении.

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@login_required
def like(request, pk):


    currentTweet = get_object_or_404(Tweet,pk=pk)
    user = User.objects.get(pk=request.user.id)
    like = Like.objects.create(tweet=currentTweet, user=user)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)
    dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=user)











    return JsonResponse({
        'like_counter': currentTweet.tweet_like_counter


    })




@csrf_exempt
@login_required
def dislike(request, pk):
    currentTweet = get_object_or_404(Tweet, pk=pk)
    user = User.objects.get(pk=request.user.id)
    dislike = Disike.objects.create(tweet=currentTweet, user=user)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)
    dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=user)










    return JsonResponse({
        'like_counter':  currentTweet.tweet_like_counter

    })

Лайк создан, но пользователи смогут продолжать лайкать тот же пост.Я застрял на этом в течение дня или двух.кто-нибудь может помочь?

1 Ответ

0 голосов
/ 24 июня 2019

Я думаю, вам следует сначала проверить, существует ли подобный объект, прежде чем создавать новый подобный объект.Например:

@csrf_exempt
@login_required
def like(request, pk):
    currentTweet = get_object_or_404(Tweet,pk=pk)
    user = User.objects.get(pk=request.user.id)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)

    if not like_queryset.exists():
        like = Like.objects.create(tweet=currentTweet, user=user)
        dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
        likeobject = Like.objects.filter(tweet=currentTweet).count()
        currentTweet.tweet_like_counter = likeobject - dislikeobject
        currentTweet.save()

    return JsonResponse({
        'like_counter': currentTweet.tweet_like_counter
    })

Небольшая оптимизация

Небольшое изменение в ответе: вам не нужно сохранять счетчик похожих в БД.Вы можете создать метод Property в модели Tweet, чтобы получить счетчик похожих.Например:

class Tweet(...):
     ...  # rest of the code

    @property
    def tweet_like_counter(self):
       likes = self.like_set.all().count()
       dislikes = self.like_set.all().count()
       return likes - dislikes

Таким образом, вам не нужно хранить одинаковый счетчик в БД, и одинаковые значения будут рассчитываться динамически.Используя этот метод свойства, вы можете обновить представление следующим образом:

@csrf_exempt
@login_required
def like(request, pk):
    currentTweet = get_object_or_404(Tweet,pk=pk)
    user = User.objects.get(pk=request.user.id)
    like_queryset = Like.objects.filter(tweet=currentTweet, user=user)

    if not like_queryset.exists():
        like = Like.objects.create(tweet=currentTweet, user=user)

    return JsonResponse({
        'like_counter': currentTweet.tweet_like_counter
    })
...