Jak już jesteśmy w temacie refaktoryzacji, to zajmiemy się tym razem formularzem rejestracji użytkowników.
Najpierw dodajmy klasę odpowiadającą za obsługę formularza:
<pre>class RegisterUserForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput(), label='Hasło') confirm_password = forms.CharField(widget=forms.PasswordInput(), label='Powtórz hasło') def __init__(self, *args, **kwargs): super(RegisterUserForm, self).__init__(*args, **kwargs) class Meta: model = User fields = ['username', 'password'] def clean(self): username = self.cleaned_data.get('username') password = self.cleaned_data.get("password") conf_password = self.cleaned_data.get("confirm_password") if password != conf_password: raise forms.ValidationError(_("Podane hasła się nie zgadzają.")) return self.cleaned_data</pre>
Teraz przyszła pora na zmiany w klasie widoku RegisterView.
Najpierw przeniesienie nazwy szablonu do pola template_name, potem zastąpienie wywołania metody render polem success_url. Jeszcze dołóżmy form_class i dwie metody: get_context_data oraz form_valid i będzie to:
class RegisterView(CreateView): template_name = "TaskList/register.html" form_class = RegisterUserForm success_url = reverse_lazy("login") def get_context_data(self, **kwargs): context_data = super(RegisterView, self).get_context_data(**kwargs) context_data['user'] = None return context_data def form_valid(self, form): form_data = form.clean() try: User.objects.get(username__exact=form_data['username']) form.add_error('username', _('Użytkownik o tej nazwie już istnieje.')) return super(RegisterView, self).form_invalid(form) except ObjectDoesNotExist: # Wykonuj, jeżeli nie ma takiego użytkownika (happy path) user = User(username=form_data['username']) user.set_password(form_data['password']) user.save() return super(RegisterView, self).form_valid(form)
I mamy mniej kodu odpowiadającego za rejestrację nowych użytkowników. Ale jest jedna zmiana: zamiast używać chronionego pola _errors jest metoda add_error, która służy do dodawania dodatkowych błędów formularza.