Django подписчиков ajax проблема - PullRequest
0 голосов
/ 12 июля 2020

Я создал функцию отслеживания пользователей с помощью 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 %}

1 Ответ

0 голосов
/ 13 июля 2020

Я нашел, в чем проблема. Ошибка, которую я получаю, была вызвана этой строкой кода в функции просмотра:


    create_action(request.user, 'is following', user)

Я использовал несуществующую функцию create_action. После удаления все работает нормально.

...