Django中不存在用户匹配查询

时间:2020-07-22 22:19:13

标签: javascript django ajax django-models django-views

我一直在尝试将后续系统添加到我的django项目中,该系统与instagram的关注系统非常相似。好吧,我到了必须添加signals.py文件的地步,以便在用户个人资料中可以有一个关注者计数,运行代码后,我在jquery上遇到了500错误,并且有一个用户匹配查询具有跟随视图的网址中不存在错误。我该怎么做才能避免出现此错误?

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    connection = models.CharField(max_length = 100, blank=True)
    follower = models.IntegerField(default=0)
    following = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.user.username} Profile'

class Following(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    followed = models.ManyToManyField(User, related_name="followed")
    follower = models.ManyToManyField(User, related_name="follower")

    @classmethod
    def follow(cls, user, another_account):
        obj, create = cls.objects.get_or_create(user = user)
        obj.followed.add(another_account)
        print("followed")

    @classmethod
    def unfollow(cls, user, another_account):
        obj, create = cls.objects.get_or_create(user = user)
        obj.followed.remove(another_account)
        print("unfollowed")

    def __str__(self):
        return f'{self.user.username} Profile'

views.py

def follow(request, username):
    main_user = request.user
    to_follow = User.objects.get(username=username)
    following = Following.objects.filter(user = main_user, followed = to_follow)
    is_following = True if following else False 


    if is_following:
        Following.unfollow(main_user, to_follow)
        is_following = False
    else:
        Following.follow(main_user, to_follow)
        is_following = True
    resp = {
        'following': is_following,
    }

    response = json.dumps(resp)
    return HttpResponse(response, content_type="application/json")

def profile(request, username):
    profile, created = Profile.objects.get_or_create(user=request.user)
    user = User.objects.filter(username=username)
    if user:
        post_owner = get_object_or_404(User, username=username)
        user = user[0]
        is_following = Following.objects.filter(user=request.user, followed=user)
        following_obj = Following.objects.get(user=user)
        follower = following_obj.follower.count()
        following = following_obj.followed.count()

    args1 = {
        'user_obj':user,
        'post_owner': post_owner,
        'follower': follower,
        'following': following,
        'connection': is_following,
    }
    return render(request, 'profile.html', args1)

signals.py

@receiver(m2m_changed, sender = Following.followed.through) # which list is changed
def add_follower(sender, instance, action, reverse, pk_set, **kwargs):
    followed_users = [] # list of users main (logged ) user have followed
    logged_user = User.objects.get(username = instance) # user who followed other users
    for i in pk_set:
        user = User.objects.get(pk = i)
        following_obj = Following.objects.get(user = user)
        followed_users.append(following_obj)

    if action == "pre_add":
        for i in followed_users:
            i.follower.add(logged_user)
            i.save()

    if action == "pre_remove":
        for i in followed_users:
            i.follower.remove(logged_user)
            i.save()

html

<head>
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
</head>
<body>
{% if connection %}
    <a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' user_obj.username %}">Unfollow</a>
{% elif not connection %}
    <a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' user_obj.username %}">Follow</a>
{% endif %}
<script type="text/javascript">
    $("#follow").click(function(e){
        e.preventDefault();
        var href = this.href;
        $.ajax({
            url : href,
            success : function(response){
                if(response["following"]){
                    $("#follow").html("Unfollow");
                }
                else{
                    $("#follow").html("Follow");
                }
            }
        })
    })
</script>
</body>

追踪

Traceback (most recent call last):
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\USER\startup\gstartup\accounts\views.py", line 115, in follow
    Following.unfollow(main_user, to_follow)
  File "C:\Users\USER\startup\gstartup\accounts\models.py", line 43, in unfollow
    obj.followed.remove(another_account)
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\models\fields\related_descriptors.py", line 961, in remove
    self._remove_items(self.source_field_name, self.target_field_name, *objs)
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\models\fields\related_descriptors.py", line 1179, in _remove_items
    signals.m2m_changed.send(
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\dispatch\dispatcher.py", line 173, in send
    return [
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\dispatch\dispatcher.py", line 174, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "C:\Users\USER\startup\gstartup\accounts\signals.py", line 11, in add_follower
    logged_user = User.objects.get(username = instance) # user who followed other users
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\models\query.py", line 415, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

0 个答案:

没有答案
相关问题