我正在使用Django插件django-ajax-validation,它在使用jQuery构建AJAX表单时为我处理表单验证。
基本上,它完成它所说的。但是,现在我愿意在我的应用程序中实现更多表单,我需要几个URL用于AJAX请求。目前我的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可以接受任何参数(命名或未命名),您也可以 提供一个回调函数,这个函数给出了请求,* args, 和** kwargs并且应该返回一个传递给它的字典 表单构造函数。
来自消息来源:
def validate(request, *args, **kwargs):
form_class = kwargs.pop('form_class')
extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
...
答案 0 :(得分: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)