Search code examples
pythondjangodecoratorintrospectiondajaxice

django - Generate a dajaxice function that validates forms (dajaxice_register issue)


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


Solution

  • 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 :|