使用Python魔法分解Django URL

时间:2013-07-01 15:34:48

标签: python django django-urls

情况


我正在使用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: {})
    ...

问题


  • 分解此类网址的好方法是什么?不必编辑插件源对我来说是件好事。

1 个答案:

答案 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)