Как ограничить один лайк за пост в Django - PullRequest
2 голосов
/ 11 ноября 2019

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

Models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)
    like=models.IntegerField(default=0)
    user = models.ForeignKey(User)

    def __str__(self):
        return self.text

Просмотров, py

def like(request,todo_id):
    if Todo.objects.filter(todo_id = todo_id, user_id=request.user.id).exists():
        return redirect('index')
    else:
        todo = Todo.objects.get(pk=todo_id)
        todo.like += 1
        todo.save()
        return redirect('index')

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Чего я в основном упускал, так это сохранения лайков, соответствующих пользователюИ эта проблема легко решается путем создания модели с пользовательской и основной моделью в качестве внешнего ключа, как указал Паоло.

models.py

from django.db import models
from django.contrib.auth.models import User

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)

    def __str__(self):
        return self.text

class Todo_likes(models.Model):
    todo = models.ForeignKey(Todo, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

views.py

from django.shortcuts import render,redirect
from .models import Todo,Todo_likes
from .forms import TodoForm

def like(request,todo_id):
    user = request.user
    todo = Todo.objects.get(id=todo_id)
    like, created = Todo_likes.objects.get_or_create(   # get_or_create will 
                                                        # itself do the job of 
                                                        # finding and creating if not exist
        user = user,
        todo = todo
    )
    if not created:
        return redirect('index') #I don't wanted to show any error if existed earlier.
                                 #I just wanted to redirect.

    else:
        return redirect('index') 

И затем подсчитываем количество моих лайков попросто зайдите в мой индексный вид и вставьте

def index(request):
    form = TodoForm()
    todo_list = Todo.objects.order_by('id')
    likes = Todo_likes.objects.count()  # Adding this line
    context= {'todo' : todo_list, 'form':form, 'likes' : likes} 
    return render(request,'todolistapp/index.html',context)

и отобразите объект «лайки» в моем шаблоне.

0 голосов
/ 11 ноября 2019

Я хотел бы попробовать и расширить свой комментарий.

Я предлагаю создать новую модель Todo_Likes, которая будет иметь как Todo, так и User модель как * 1006. * чтобы можно было отслеживать, кому понравился Todo.

models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)
    # Got rid of the user FK and like since I would count likes using
    # Todo_Like.objects.count()

    def __str__(self):
        return self.text

class Todo_Like(models.Model):
    todo = models.ForeignKey(Todo)
    user = models.ForeignKey(User)

просмотров.py

def like(request,todo_id):
    # Get user
    user = request.user
    # Get Todo object
    todo = Todo.objects.get(id=todo_id)

    # Check/Validate if current user has already liked the Todo. 
    # If not create a new Todo_Like object.

    todo_like = Todo_Like.objects.get(todo=todo, user=user)

    if not todo_like:
        # If the user haven't like the Todo object yet create a Todo_Like object.
        t = Todo_Like (
            todo=todo,
            user=user
            )
        t.save()
    else:
        # If the user has already liked the Todo then proceed to do
        # Whatever you want, redirect? message?

Я также хотел бы ответить на вопрос заранее.

  1. Вы можете спросить , как бы вы подсчитали лайки сейчас? ? Ответ: Используйте Todo_Like.objects.count () и убедитесь, что считаете его по Todo.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...