0

dajaxiceを使用してモデルフォームをリアルタイムで検証するジェネリック関数を作成したいと思います。

これが私がしたことです:

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

アカウント/ajax.py

from exafeeds.ajax import gen_validate_model

import accounts.models

validate_model = gen_validate_model(accounts.models)

そして、js呼び出し:

Dajaxice.accounts.validate_model(check_validity_callback, {
    'model': 'User',
    'fields': {
        'username': username,
        'email': email
    }
});

しかし、Dajaxice.accountsが未定義であるというJSエラーが発生した場合。

dajaxice_registerデコレータは明らかに間違った場所に配置されていますが、どこに配置すればよいですか?

編集。dajaxice_registerデコレータを次のように置き換えようとしました。

validate_model = gen_validate_model(accounts.models)
validate_model = dajaxice_register(validate_model)

しかし、それは何も変わりませんでした

4

1 に答える 1

0

解決策を見つけましたが、汚れているようです。より良い解決策をいただければ幸いです。

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

アカウント/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)

しかし、関数発生器は役に立たなくなるので、次のように簡略化できます。

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)

アカウント/ajax.py

@dajaxice_register
def validate_model(request, model, fields):
    return gen_validate_model(accounts.models, request, model, fields)

かなりひどい:|

于 2012-09-01T13:00:08.860 に答える