У меня есть проект Django, над которым я работаю. Пользователи смогут любить и не нравиться сообщение.
models.py
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.ManyToManyField(User)
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.ManyToManyField(User)
tweet = models.ForeignKey(Tweet, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.tweet.tweet_message
views.py
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@login_required
def like(request, pk):
currentTweet = get_object_or_404(Tweet,pk=pk)
username = User.objects.get(pk=request.user.id)
like_queryset = Like.objects.filter(tweet=currentTweet, user=username)
dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=username)
if like_queryset.exists():
Like.objects.filter(tweet=currentTweet, user=username).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=username).delete()
dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
likeobject = Like.objects.filter(tweet=currentTweet).count()
currentTweet.tweet_like_counter = likeobject - dislikeobject
currentTweet.save()
like = Like.objects.create(tweet=currentTweet)
like.user.add(username)
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)
username = User.objects.get(pk=request.user.id)
like_queryset = Like.objects.filter(tweet=currentTweet, user=username)
dislike_queryset = Disike.objects.filter(tweet=currentTweet, user=username)
if dislike_queryset.exists():
Disike.objects.filter(tweet=currentTweet, user=username).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=username).delete()
dislikeobject = Disike.objects.filter(tweet=currentTweet).count()
likeobject = Like.objects.filter(tweet=currentTweet).count()
currentTweet.tweet_like_counter = likeobject - dislikeobject
currentTweet.save()
dislike = Disike.objects.create(tweet=currentTweet)
dislike.user.add(username)
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
})
шаблон
<p class='id{{ post.tweet_user }}' name="tweetlikes" class="card-text" style="background-color: lightgray;"><strong>{{ post.tweet_like_counter }} likes </strong></p>
<form id="like{{ post.tweet_user }}" method="POST" name="likeform" action="{% url 'like' pk=post.pk %}" style="float:left;">
{% csrf_token %}
<button type="submit" class="like-form" name="like" class="btn btn-primary" >Like</button>
</form>
<script>
$('#like{{ post.tweet_user }}').on('submit', function(event){
event.preventDefault();
var oldVal = parseInt($(".id{{ post.tweet_user }}").text())
var url = $('#like{{ post.tweet_user }}').attr('action');
$.ajax({
type: 'POST',
url:url,
data:{
'like_counter':oldVal
},
dataType: 'json',
success:function(data){
$(".id{{ post.tweet_user }}").html(data.like_counter + " " + "likes");
}
})
})
</script>
<form id="dislike{{ post.tweet_user }}" name="dislikeform" method="POST" action="{% url 'dislike' pk=post.pk %}" style="float:right;" >
{% csrf_token %}
<button type="submit" class="btn btn-primary">Dislike</button>
</form>
<script>
$('#dislike{{ post.tweet_user }}').on('submit', function(e){
e.preventDefault();
var oldVal = parseInt($(".id{{ post.tweet_user }}").text())
var url = $('#dislike{{ post.tweet_user }}').attr('action');
$.ajax({
type: 'POST',
url:url,
data:{
'like_counter':oldVal
},
dataType: 'json',
success:function(data){
$(".id{{ post.tweet_user }}").html(data.like_counter + " " + "likes");
}
})
})
</script>
</div>
Проблема в моем аяксе. Функциональность моего сайта прекрасно работает. Это просто Аякс. Когда пользователь нажимает кнопку «Мне нравится» в первом сообщении, он позволяет пользователю только один раз нажать кнопку «Мне нравится». Когда другой пользователь публикует сообщение (которое создает два сообщения на странице), кнопки «похожие сообщения» больше не работают, и это меняет тег номера «одинаково», а также делает данные разнородными. Помогите пожалуйста?