Я создал функцию отслеживания пользователей с помощью Ajax, чтобы пользователь мог подписаться на другого пользователя / отписаться от него. Проблема в том, что когда я нажимаю кнопку «следовать», во внешнем интерфейсе ничего не происходит. Я имею в виду, что текст не меняется на «Отписаться», как должен быть, и количество подписчиков тоже не меняется. Если перезагрузить страницу, ничего страшного - подписчик добавлен. Затем, если я нажимаю кнопку «Отписаться», все работает нормально - запрос Ajax в порядке, а в базе данных подписчик удаляется. Я обнаружил, что проблема возникает из-за того, что при нажатии кнопки «Follow» и отправке запроса Post код ответа - 500 (внутренняя ошибка сервера). С «Отписаться» он работает нормально, и запрос 200. Я потратил много времени, борясь с этим. Требуется любая справка.
Ниже указан код.
Модель пользователя и модель для следующих функций:
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _
from django.urls import reverse
from django.conf import settings
from .managers import CustomUserManager
from team.models import Team
class Contact(models.Model):
user_from = models.ForeignKey('CustomUser',
related_name='rel_from_set',
on_delete=models.CASCADE)
user_to = models.ForeignKey('CustomUser',
related_name='rel_to_set',
on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True,
db_index=True)
class Meta:
ordering = ('-created',)
def __str__(self):
return '{} follows {}'.format(self.user_from,
self.user_to)
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
team = models.ForeignKey(Team, null=True, blank=True, on_delete=models.SET_NULL)
profile_img = models.ImageField(null=True,blank=True)
following = models.ManyToManyField('self', through=Contact, related_name='followers', symmetrical=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
def get_absolute_url(self):
return reverse('user-detail', kwargs={'id': self.id})
просмотров .py файл:
```
@ajax_required
@require_POST
@login_required
def user_follow(request):
user_id = request.POST.get('id')
action = request.POST.get('action')
if user_id and action:
try:
user = CustomUser.objects.get(id=user_id)
if action == 'follow':
Contact.objects.get_or_create(user_from=request.user,
user_to=user)
create_action(request.user, 'is following', user)
else:
Contact.objects.filter(user_from=request.user,
user_to=user).delete()
return JsonResponse({'status':'ok'})
except CustomUser.DoesNotExist:
return JsonResponse({'status':'ok'})
return JsonResponse({'status':'ok'})
urls.py:
urlpatterns = [
path('users/follow/', views.user_follow, name='user_follow'),
...another urls...
]
Кнопка подписки / отмены подписки, отображаемая в html:
{% with total_followers=user.followers.count %}
<span class="count-f">
<span class="total-f">{{ total_followers }}</span>
follower{{ total_followers|pluralize }}
</span>
<a href="#" data-id="{{ user.id }}" data-action="{% if request.user in user.followers.all %}un{% endif %}follow" class="follow button">
{% if request.user not in user.followers.all %}
Follow
{% else %}
Unfollow
{% endif %}
</a>
{% endwith %}
И в том же html файле код ajax:
{% block domready %}
$('a.follow').click(function(e){
e.preventDefault();
const $clickedFollowButton = $( this );
$.post('{% url "user_follow" %}',
{
id: $clickedFollowButton.data('id'),
action: $clickedFollowButton.data('action')
},
function(data){
if (data['status'] == 'ok') {
var previous_action = $clickedFollowButton.data('action');
// toggle data-action
$clickedFollowButton.data('action', previous_action == 'follow' ? 'unfollow' : 'follow');
// toggle link text
$clickedFollowButton.text(previous_action == 'follow' ? 'Unfollow-ha-ha' : 'Follow');
// update total followers
const $totalFollowers = $clickedFollowButton.prev('span.count-f').children('.total-f');
var previous_followers = parseInt(
$('span.count-f .total-f').text());
$totalFollowers.text(previous_action == 'follow' ? previous_followers + 1 : previous_followers - 1);
console.log(previous_action);
}
}
);
});
{% endblock %}