dev9
dev9

Reputation: 2382

How to perform custom form validation in views in Django

After successful validation, how can I redisplay a form with some error from a view?

Example: User filled the form correctly, but his IP has been banned, so he should see a proper error message. And I want it to be displayed as any other validation error.

class MyView(CreateView):
form_class = MyForm
model = MyModel

def form_valid(self, form):
    banned = is_ip_banned(self.request)
    if banned:
        # add error message 'You have been banned'
        # redisplay a form with defined errors
    return super(MyView, self).form_valid(form)

Note that I cannot just override form.is_valid(), because I need the request variable.

Upvotes: 0

Views: 251

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599630

If you need the request when validating the form, you should simply pass it in.

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super(MyForm, self).__init__(*args, **kwargs)

    def clean(self):
        if is_ip_banned(self.request):
            raise forms.ValidationError('You have been banned')

...

 class MyView(forms.Form):
     def get_form(self, form_class):
         form_kwargs = self.get_form_kwargs()
         form_kwargs['request'] = self.request
         return form_class(**form_kwargs)

Upvotes: 1

Related Questions