我正在尝试实现类似 Twitter 的关注系统(一个用户可以关注并被许多其他用户关注)。我尝试了很多方法,但我总是出错。目前,每次我在整个表单中放置调试器或打印语句时,我发现我从来没有进入干净的方法,也没有用值填充 kwargs。
我希望能够将 follower 和 following 作为参数传递给表单,并在 __init__ 中分配它们,但一切出问题了。当我在 Javascript(React 和 Redux)中得到响应时,我得到的只是 follower 和 following 的错误,说“这个字段是必需的。”
这是我到目前为止所得到的:
模型
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=100, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now=True)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'
class UserFollow(models.Model):
follower = models.ForeignKey('User', models.CASCADE, related_name='follows')
following = models.ForeignKey('User', models.CASCADE, related_name='followed_by')
class Meta:
unique_together = ('follower', 'following')
def to_user(self):
return {
'id': self.pk,
'follower': self.follower.pk,
'following': self.following.pk
}
观看次数
def follow(request, id):
following = User.objects.get(pk=id)
form = UserFollowForm(follower=request.user, following=following)
if form.is_valid():
user_follow = form.save()
return JsonResponse({'user_followed': following.to_user()})
return JsonResponse({'error': form.errors}, status=400)
表格
class UserFollowForm(forms.ModelForm):
follower = forms.CharField()
following = forms.CharField()
class Meta:
model = UserFollow
fields = ('follower', 'following')
def __init__(self, *args, **kwargs):
self.follower = kwargs.pop('follower', None)
self.following = kwargs.pop('following', None)
super(UserFollowForm, self).__init__(*args, **kwargs)
def clean_follower(self):
return self.follower
def clean_following(self):
return self.following
请您参考如下方法:
您还没有将任何数据传递到表单中,因此它没有被绑定(bind)并且永远不会被验证。
但是我根本不明白你为什么要在这里使用表单。您似乎不想从用户那里获取已发布的数据,并且无需进行验证。只需直接创建您的 UserFollow 实例即可。
def follow(request, id):
following = User.objects.get(pk=id)
user_follow = UserFollow.objects.create(follower=request.user, following=following)
return JsonResponse({'user_followed': user_follow.to_user()})
