表单在 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()
方法调用此调用。
我有这样一个表格,如下图。 当我单击 "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()
方法调用此调用。