Skip to main content
 首页 » 编程设计

python之简单的 Django 表单

2024年08月19日2952php

我正在尝试实现类似 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()})