I'd like to make a generic function to validate modelforms in real time with dajaxice.
Here is what i did :
exafeeds/ajax.py
from django.core.exceptions import ValidationError
from django.utils import simplejson
from dajaxice.decorators import dajaxice_register
def gen_validate_model(models_module):
@dajaxice_register
def validate_model(request, model, fields):
errors = {}
tmp_model = getattr(models_module, model)()
for (field, value) in fields.items():
setattr(tmp_model, field, value)
try:
tmp_model.clean_fields()
except ValidationError, err:
errs = err.message_dict
for field in fields:
errors[field] = errs.get(field)
return simplejson.dumps(errors)
return validate_model
accounts/ajax.py
from exafeeds.ajax import gen_validate_model
import accounts.models
validate_model = gen_validate_model(accounts.models)
And the js call :
Dajaxice.accounts.validate_model(check_validity_callback, {
'model': 'User',
'fields': {
'username': username,
'email': email
}
});
But when I get a JS error telling me that Dajaxice.accounts is undefined.
The dajaxice_register decorator is obviously wrong-placed, but where should I put it ?
Edit. I tried to replace the dajaxice_register decorator with this:
validate_model = gen_validate_model(accounts.models)
validate_model = dajaxice_register(validate_model)
But it didn't change anything
I found a solution, but it looks dirty. I would appreciate a better solution.
exafeeds/ajax.py
from django.core.exceptions import ValidationError
from django.utils import simplejson
def gen_validate_model(models_module):
def validate_model(request, model, fields):
errors = {}
tmp_model = getattr(models_module, model)()
for (field, value) in fields.items():
setattr(tmp_model, field, value)
try:
tmp_model.clean_fields()
except ValidationError, err:
errs = err.message_dict
for field in fields:
errors[field] = errs.get(field)
return simplejson.dumps(errors)
return validate_model
accounts/ajax.py
from dajaxice.decorators import dajaxice_register
from exafeeds.ajax import gen_validate_model
import accounts.models
@dajaxice_register
def validate_model(request, model, fields):
return gen_validate_model(accounts.models)(request, model, fields)
But the function generator gets useless, so it can be simplified in :
exafeeds/ajax.py
def gen_validate_model(models_module, request, model, fields):
errors = {}
tmp_model = getattr(models_module, model)()
for (field, value) in fields.items():
setattr(tmp_model, field, value)
try:
tmp_model.clean_fields()
except ValidationError, err:
errs = err.message_dict
for field in fields:
errors[field] = errs.get(field)
return simplejson.dumps(errors)
accounts/ajax.py
@dajaxice_register
def validate_model(request, model, fields):
return gen_validate_model(accounts.models, request, model, fields)
Quite awfull :|