2015-02-20 2 views
0

У меня есть такая форма, как показано ниже. При нажатии на кнопку «Добавить» вместо уведомления о том, что поля обязательны для заполнения Я получаю сообщение об ошибке:Форма не подтверждена в Django

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 

ответ

2

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() 

UPDATE: Если пользователь не выбирает какую-либо группу или пользователя на форме 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 

И вы не должны вызывать group.user_set.add(user) в clean(). Этот вызов нужно вызвать из метода save() формы.

+0

Теперь я получаю: объект ''NoneType' не имеет атрибута 'user_set'' – mark

+0

См. Обновленный ответ. – catavaran

+0

Спасибо большое :) – mark

Смежные вопросы