1

情况


我正在使用 Django 插件django-ajax-validation,它在使用 jQuery 构建 AJAX 表单时为我处理表单验证。

基本上,它会按照它所说的去做。然而,现在我愿意在我的应用程序中实现更多的表单,我需要几个用于 AJAX 请求的 URL。现在我的ajax/urls.py包含:

urlpatterns = patterns('ajax_validation.views',
    url(r'^validate/foo$', 'validate', {'form_class':FooForm}, name='validate-form-foo'),
    url(r'^validate/bar$', 'validate', {'form_class':BarForm}, name='validate-form-bar'),
)

但这对我来说看起来很丑,而且很难维护。这是我想做的事情:

FORMS = {
    'foo': FooForm,
    'bar': BarForm,
}

urlpatterns = patterns('ajax_validation.views',
    url(r'^validate/(?P<label>[^/]+)$', 'validate', {'form_class':FORMS[label]}, name='validate-form'),
)

但这显然不起作用。

什么可能有帮助


从文档中:

URL 可以接受任何参数(命名的或未命名的),您还可以提供一个回调函数,该函数由 request、*args 和 **kwargs 提供,并且应该返回一个传递给表单构造函数的字典。

从来源:

def validate(request, *args, **kwargs):
    form_class = kwargs.pop('form_class')
    extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
    ...

问题


  • 如果有的话,分解此类 URL的好方法是什么?不必编辑插件源对我来说是件好事。
4

1 回答 1

1

这是未经测试的,但我看不出有任何理由不能为patterns构造函数构建 args 序列:

FORMS = {
    'foo': FooForm,
    'bar': BarForm,
}

validate_patterns = [url(r'^validate/%s' % label, 'validate', {'form_class': FORMS[label]}, name='validate-form-%s' % label) for label in FORMS.iterkeys()]

urlpatterns = patterns('ajax_validation.views', *validate_patterns)

或者,您可以定义自己的单个视图来适当地调用插件视图:

urlpatterns = patterns('myapp.views',
    url(r'^validate/(?P<label>[^/]+)$', 'validate_by_label', name='validate-form'),
)

views.py:
# appropriate imports for Http404, your forms, and the third party plugin validate view

FORMS = {
    'foo': FooForm,
    'bar': BarForm,
}

def validate_by_label(request, label):
    form_class = FORMS.get(label)
    if form_class is None:
        raise Http404
    else:
        return ajax_validation.views.validate(request, form_class=form_class)
于 2013-07-01T18:33:28.683 回答