27👍
I think gruszczy’s answer is a good one, but if you’re after generic validation involving variables that you think are only available in the view, here’s an alternative: pass in the vars as arguments to the form and deal with them in the form’s main clean() method.
The difference/advantage here is that your view stays simpler and all things related to the form content being acceptable happen in the form.
eg:
# IN YOUR VIEW
# pass request.user as a keyword argument to the form
myform = MyForm(user=request.user)
# IN YOUR forms.py
# at the top:
from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting
# and in your particular Form definition
class MyForm(forms.Form)
... your fields here ...
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user') # cache the user object you pass in
super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form
def clean(self):
# test the rate limit by passing in the cached user object
if not ok_to_post(self.user): # use your throttling utility here
raise forms.ValidationError("You cannot post more than once every x minutes")
return self.cleaned_data # never forget this! ;o)
Note that raising a generic ValidationError
in the clean()
method will put the error into myform.non_field_errors
so you’ll have to make sure that your template contains {{form.non_field_errors}}
if you’re manually displaying your form
9👍
You don’t use ValidationError
in views, as those exceptions as for forms. Rather, you should redirect the user to some other url, that will explain to him, that he cannot post again that soon. This is the proper way to handle this stuff. ValidationError
should be raised inside a Form
instance, when input data doesn’t validate. This is not the case.
- [Django]-Is this the right way to do dependency injection in Django?
- [Django]-How to pull a random record using Django's ORM?
- [Django]-How to write django test meant to fail?
5👍
You can use messages in views:
from django.contrib import messages
messages.error(request, "Error!")
Documentation: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/
- [Django]-Proper way to bulk_create for ManyToMany field, Django?
- [Django]-Pagination in Django-Rest-Framework using API-View
- [Django]-Why does django ORM's `save` method not return the saved object?