Как отредактировать экземпляр extend user в собственной форме?

#django #validation #forms #edit

#django #проверка #формы #Редактировать

Вопрос:

Я не могу отредактировать экземпляр Instructor. Добавление нового инструктора работает неплохо, но когда я пытаюсь сохранить существующий экземпляр инструктора, у меня возникает ошибка: «Пользователь с этим именем пользователя уже существует!». Это мой код просмотра:

 @login_required

def instructor_edit(request, userprofile_id):
    user_group = check_user_group(request)
    if request.user.is_authenticated():
        user_to_edit = User.objects.get(userprofile__id=userprofile_id)
        try:
            instructor_to_edit = UserProfile.objects.get(id=userprofile_id)
        except UserProfile.DoesNotExist:
            return Http404
        if request.method == "POST":
            uform = UserForm(request.POST, instance=user_to_edit)
            form = AddInstructorForm(request.POST, request.FILES, instance=instructor_to_edit)
            if request.POST.get('cancel'):
                return HttpResponseRedirect('/')
            if uform.is_valid() and form.is_valid():
                # adding new user
                added_user = uform.save()
                added_user.set_password(request.POST.get('password'))
                grupa = Group.objects.get(name=u'instructor')
                added_user.groups.add(grupa)
                added_user.save()
                # saving instructor to database
                instructor = form.save(commit=False)
                instructor.user = added_user
                instructor.save()
                form.save_m2m()
                warning = "Instructor changed!"
                return render_to_response('archiwum/message.html', {'warning' : warning, 'user_group' : user_group,}, context_instance = RequestContext(request))
            else:
                uform = UserForm(request.POST)
                form = AddInstructorForm(request.POST, request.FILES)
                return render_to_response('archiwum/add_instructor.html', {'user_group':user_group, 'uform':uform, 'form':form,}, context_instance = RequestContext(request))
        else:
            uform = UserForm(instance=user_to_edit)
            form = AddInstructorForm(instance=instructor_to_edit)
        return render_to_response('archiwum/add_instructor.html', {'user_group' : user_group, 'uform':uform, 'form' : form,}, context_instance = RequestContext(request))
    else:
        warning = "You don't have permissions to do it!"
        return render_to_response('archiwum/message.html', {'warning' : warning}, context_instance = RequestContext(request))
  

РЕДАКТИРОВАТЬ: я тоже поместил свои формы. Возможно, это поможет вам!

 class UserForm(forms.ModelForm):
    username = forms.RegexField(max_length=30, regex=r'^[w.@ -] $', widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required':'Proszę wpisać nazwę użytkownika!', 'invalid':'Nazwa zawiera niedozwolone znaki!'},)
    password = forms.CharField(widget=forms.PasswordInput(attrs={'size': 93,}), error_messages={'required': 'Proszę wpisać hasło!'})
    confirm_password = forms.CharField(widget=forms.PasswordInput(attrs={'size': 93,}), error_messages={'required': 'Proszę powtórzyć hasło'},)
    first_name = forms.CharField(widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required': 'Proszę wpisać imię!'})
    last_name = forms.CharField(widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required': 'Proszę wpisać nazwisko!'})
    email = forms.EmailField(widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required': 'Proszę wpisać adres e-mail!', 'invalid':'Adres e-mail jest niepoprawny!'},)
    is_active = forms.BooleanField(required=False, initial=True, help_text="Odznacz to pole zamiast usuwać użytkownika, żeby unieaktywnić konto.")

    class Meta:
        model = User
        fields = ["username", "password", "confirm_password", "first_name", "last_name", "email",]

    def clean_username(self):    
        username = self.cleaned_data["username"]
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(_("Użytkownik o tej nazwie już istnieje! Wybierz inną nazwę."))

    def clean_confirm_password(self):
            if self.cleaned_data['password'] != self.cleaned_data['confirm_password']:
                raise forms.ValidationError('Popraw hasło!')
            else:
                if len(self.cleaned_data['password']) < 6 and len(self.cleaned_data['password']) >0:
                    raise forms.ValidationError('Hasło musi się składać przynajmniej z 6 znaków!')


class AddInstructorForm(ModelForm):
    #pesel = PLPESELField
    prefix = forms.CharField(label="Tytuł naukowy", widget = forms.TextInput(attrs={'size': 30,}), required=False)
    birth_date = forms.DateField(label="Data urodzenia", widget=SelectDateWidget(years=range(1930,2011)), required=False, error_messages={'required': 'Proszę podać datę urodzenia!', 'invalid':'Proszę podać poprawną datę!'})    
    adress = forms.CharField(label="Adres (miasto, ulica, kod pocztowy)", widget = forms.TextInput(attrs={'size': 93,}), required=False)
    description = forms.CharField(label="Uwagi", widget=forms.Textarea(attrs={'rows': 5, 'cols': 120,}), required=False)

    class Meta:
        model = UserProfile
        fields = ('second_name', 'prefix', 'instr_subjects', 'birth_date', 'adress', 'phone', 'pesel', 'account', 'photo', 'remove_the_photo', 'description', 'curriculum_vitae', 'remove_the_cv',)
  

Комментарии:

1. Вам также следует включить сюда код для ваших классов form, поскольку, скорее всего, они являются причиной этого ValidationError .

Ответ №1:

Если вы вызываете is_valid() для UserForm объекта, он будет запущен clean_username , и это всегда будет выдавать, ValidationError если User объект с заданным username значением уже существует / был создан ранее. (Это означает, что вы не можете сделать что-то вроде «редактирования» существующего пользователя с его помощью)