表单在 Django 中不验证

Form does not validate in Django

我有这样一个表格,如下图。 当我单击 "Add" 按钮而不是需要字段的通知时,我收到错误消息:

DoesNotExist at /users/add-to-group/
Group matching query does not exist.

我的表单代码

class AddUserToGroupForm(forms.ModelForm):
    group = forms.ModelChoiceField(queryset=Group.objects.all(), required=True)
    user = forms.ModelChoiceField(queryset=User.objects.all(), required=True)

    class Meta:
        model = User
        fields = ['group', 'user']

    def has_group(self, user, group_name):
        group1 = Group.objects.get(name=group_name)
        return True if group1 in user.groups.all() else False

    def clean(self):
        cleaned_data = super(AddUserToGroupForm, self).clean()
        g = Group.objects.get(name=cleaned_data.get('group'))
        g.user_set.add(cleaned_data.get('user'))
        if self.has_group(cleaned_data.get('user'), cleaned_data.get('group')):
            self.add_error('user', "This user is already in group.")
        return cleaned_data

cleaned_data 包含 Group 实例,而不是 Group 的名称。所以你不应该使用这个查询:

Group.objects.get(name=cleaned_data.get('group'))

只需将组实例分配给 g 变量:

g = cleaned_data.get('group')

与您在 has_group 函数中遇到的问题相同。 group_name 参数是 Group。代码应该是:

def has_group(self, user, group):
    return group in user.groups.all()

更新:如果用户未在表单中选择任何组或用户,则 cleaned_data 不包含 group/user 值。所以你必须在 clean() 方法中检查这种情况:

def clean(self):
    cleaned_data = super(AddUserToGroupForm, self).clean()
    group = cleaned_data.get('group')
    user = cleaned_data.get('user')
    if group and user:
        if self.has_group(user, group)):
            self.add_error('user', "This user is already in group.")
    return cleaned_data

而且你不应该在 clean() 中调用 group.user_set.add(user)。必须从表单的 save() 方法调用此调用。