我一直在尝试将后续系统添加到我的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.