Nurzhan Nogerbek
Nurzhan Nogerbek

Reputation: 5236

UserCreationForm show error when fields are empty

I'm using Django built in UserCreationForm. I want to show message under the field when that field is empty and user tring to submit form. Unfortunatly I see only built-in behavior of browsers like "fill out this field", by the way in different browsers that behavior is different. Some browsers just encircle the field box with a red line. How to turn off this behavior and show message under the field. Why .error_messages didnt work?! Also I use {{ form.field_name.errors }} in my template.

forms.py

class RegistrationForm(UserCreationForm):
    required_css_class = 'required'
    email = forms.EmailField()
    first_name = forms.CharField()
    last_name = forms.CharField()

    class Meta:
        model = User
        fields = ('username', 'email', 'first_name', 'last_name')

    def __init__(self, *args, **kwargs):
        super(RegistrationForm, self).__init__(*args, **kwargs)
        self.fields['username'].widget = TextInput(attrs={'placeholder': _('Username')})
        self.fields['username'].required = True
        self.fields['username'].error_messages = {'required': 'Please enter your username'}

        self.fields['email'].widget = EmailInput(attrs={'placeholder': _('Email address')})
        self.fields['email'].required = True
        self.fields['email'].error_messages = {'required': 'Please enter your email'}

        self.fields['first_name'].widget = TextInput(attrs={'placeholder': _('First name')})
        self.fields['first_name'].required = True
        self.fields['first_name'].error_messages = {'required': 'Please enter your first_name'}

        self.fields['last_name'].widget = TextInput(attrs={'placeholder': _('Last name')})
        self.fields['last_name'].required = True
        self.fields['last_name'].error_messages = {'required': 'Please enter your last_name'}

        self.fields['password1'].widget = PasswordInput(attrs={'placeholder': _('Password')})
        self.fields['password1'].required = True
        self.fields['password1'].error_messages = {'required': 'Please enter your Password'}

        self.fields['password2'].widget = PasswordInput(attrs={'placeholder': _('Confirm password')})
        self.fields['password2'].required = True
        self.fields['password2'].error_messages = {'required': 'Please enter your Confirm Password'}

view.py

class RegistrationView(FormView):
    disallowed_url = 'registration_closed'
    form_class = RegistrationForm
    http_method_names = ['get', 'post', 'head', 'options', 'trace']
    success_url = 'registration_complete'
    template_name = 'account/registration_form.html'
    SEND_ACTIVATION_EMAIL = getattr(settings, 'SEND_ACTIVATION_EMAIL', True)

    registration_profile = RegistrationProfile

    @method_decorator(sensitive_post_parameters('password1', 'password2'))
    def dispatch(self, request, *args, **kwargs):
        if not self.registration_allowed():
            return redirect(self.disallowed_url)
        return super(RegistrationView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        new_user = self.register(form)
        success_url = self.get_success_url(new_user)
        try:
            to, args, kwargs = success_url
        except ValueError:
            return redirect(success_url)
        else:
            return redirect(to, *args, **kwargs)

    def registration_allowed(self):
        return getattr(settings, 'REGISTRATION_OPEN', True)

    def register(self, form):
        site = get_current_site(self.request)

        if hasattr(form, 'save'):
            new_user_instance = form.save()
        else:
            new_user_instance = (UserModel().objects.create_user(**form.cleaned_data))

        new_user = self.registration_profile.objects.create_inactive_user(
            new_user=new_user_instance,
            site=site,
            send_email=self.SEND_ACTIVATION_EMAIL,
            request=self.request,
        )
        signals.user_registered.send(sender=self.__class__, user=new_user, request=self.request)
        return new_user

    def get_success_url(self, user=None):
        return super(RegistrationView, self).get_success_url()

Upvotes: 0

Views: 355

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599600

You need to turn off the behaviour in the HTML itself, by using novalidate in the form element.

<form action="whatever" method="POST" novalidate>
    ...
</form>

Upvotes: 1

Related Questions