Django ajax функция upvote downvote
Я очень новичок в ajax, мне нужна помощь в реализации ajax в функции django upvote-downvote utils. Я пытался сделать это самостоятельно, но не смог, любая помощь будет очень признательна, спасибо.
Вот фрагменты кода:
в моей модели: models.py
class Questions(models.Model):
title = models.CharField(max_length=long_len)
ques_content = models.TextField()
tags = models.ManyToManyField(Tags)
upvotes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='user_upvote')
downvotes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='user_downvote')
answers = models.ManyToManyField('main.Answer', related_name='answers')
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=False)
views = models.IntegerField(default=0)
is_answered = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
votes = models.IntegerField(default=0)
has_accepted_answer = models.BooleanField(default=False)
в моих утилитах: utils.py
def performUpDownVote(user,isQuestion,id,action_type):
id = int(id)
flag = False
if isQuestion == 'True':
print('------> isQ')
q = Questions.objects.get(pk = id)
if q.author == user:
return False
else:
print('------> isNotQ')
flag=True
q = Answer.objects.get(pk = id)
if q.answered_by == user:
return False
existsInUpvote = True if user in q.upvotes.all() else False
existsDownUpvote = True if user in q.downvotes.all() else False
if existsInUpvote:
if action_type == 'downvote':
q.upvotes.remove(user)
q.downvotes.add(user)
reputation(flag,-20, q)
q.votes = q.votes - 1
elif existsDownUpvote:
if action_type == 'upvote':
q.downvotes.remove(user)
q.upvotes.add(user)
reputation(flag,20, q)
q.votes = q.votes + 1
else:
if action_type == 'downvote':
q.downvotes.add(user)
reputation(flag,-10, q)
q.votes = q.votes - 1
if action_type == 'upvote':
q.upvotes.add(user)
reputation(flag,10, q)
q.votes = q.votes + 1
q.save()
return True
в моих представлениях: views.py
def questions(request):
main_query = Questions.objects
if request.GET and ('q' in request.GET) and request.GET['q'] == 'mostviewed':
all_questions = main_query.all().order_by('-views')
marked = 'mostviewed'
elif request.GET and ('q' in request.GET) and request.GET['q'] == 'unanswered':
all_questions = main_query.filter(
is_answered=False).order_by('-created_at')
marked = 'unanswered'
else:
marked = 'latest'
all_questions = main_query.all().order_by('-created_at')
total_questions = Questions.objects.count()
seeuser = StackoverflowUser
user = request.user
try:
if request.GET and request.GET['isQuestion'] and request.GET['id'] and request.GET['action_type']:
result = performUpDownVote(
user, request.GET['isQuestion'], request.GET['id'], request.GET['action_type'])
redirect_to = '/question/'+str(pk)
if 'page' in request.GET:
redirect_to += '?page='+request.GET['page']
return redirect(redirect_to)
except Exception:
pass
messages.success(request, 'Question posted successfully')
return redirect('name_questionsingle', pk=q.pk)
в urls: urls.py
urlpatterns = [
path('', views.questions, name = 'name_questions'),
path('tag/<str:tag_word>/', views.questionByTag, name = 'name_questionByTag'),
path('tag/<str:tag_word>/', views.postByTag, name = 'name_postByTag'),
path('question/<int:pk>/', views.questionsingle, name = 'name_questionsingle'),
path('post/<int:pk>/', views.postdetail, name = 'name_postdetail'),
path('askquestion/', views.askquestion, name = 'name_askquestion'),
path('createpost/', views.createpost, name = 'name_createpost'),
path('posts/', views.posts, name = 'name_posts'),
path('profile/<str:username>/', views.profile, name = 'name_profile'),
path('question/<int:pk>/<int:pk2>/', views.is_accepted, name = 'name_is_accepted'),
path('post_deleted/<int:id>', views.delete_post, name = 'post_deleted'),
path('question_deleted/<int:id>', views.delete_quest, name = 'question_deleted'),
path('comment_deleted/<int:id>', views.delete_comment, name = 'comment_deleted'),
]
html
<div class="p-1 px-4 upvote" style="margin: -10px 10px 0px 10px;">
{% if user.is_authenticated %}
<a href="?isQuestion=True&id={{q.pk}}&action_type=upvote&page={{all_answers.number}}" style="font-weight: 400;" class="upvoteaction">
<i id="upvote" class="bi bi-triangle-fill" style="font-size: 18px;" data-toggle="tooltip" title="Upvote"></i>
</a>
{% else %}
<a href="{% url 'name_questionsingle' q.pk %}" style="font-weight: 400;" data-toggle="tooltip" title="Upvote">
<i class="bi bi-triangle-fill" style="font-size: 18px;"></i>
</a>
{% endif %}
</div>
<div class="p-1 px-4 downvote" style="margin: -10px 10px 0px 10px;">
{% if user.is_authenticated %}
<style>i#di.bi-triangle-fill::before {transform: rotate(180deg);}</style>
<a href="?isQuestion=True&id={{q.pk}}&action_type=downvote&page={{all_answers.number}}"
style="font-weight: 400" data-toggle="tooltip" title="Downvote"><i id="di" class="bi bi-triangle-fill" style="font-size: 18px"></i> </a>
{% else %}
<a href="{% url 'name_questionsingle' q.pk %}" style="font-weight: 400" data-toggle="tooltip" title="Downvote"><i class="bi bi-triangle-fill"
style="font-size: 18px"></i> </a>
{% endif %}
</div>