基于Django动态类的通用视图

时间:2013-03-28 17:46:46

标签: django django-class-based-views

我们有很多,很多视图都使用我们过去在urls.py中循环的简单通用视图,并指向基于通用视图的相同函数。既然我们正在转向基于类的通用视图,我们需要复制此功能,并且我们被迫将所有逻辑移动到urls.py文件中,如下所示:

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',]

for model in GENERIC_VIEWS_EDIT:
    urlpatterns += patterns('',

        url(r'^%s/(?P<pk>\d+)/$' % model.lower(), never_cache(staff_member_required(UpdateView.as_view(
            model=eval(model),
            context_object_name='object',
            form_class=eval('%sForm' % model),
            template_name='edit_form.html',
            success_url='/yay/'
        ))), name='edit-%s' % model.lower()),

    )

虽然这很好用,但我不屑于在urls.py文件中拥有所有这些“视图代码”。此外,如果我需要覆盖这些N个模型中的一个或两个的方法,这种实现使得这是不可能的。

有什么方法可以将模型作为参数传递,并将我的通用视图移回views.py,就像这样?

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',]

for model in GENERIC_VIEWS_EDIT:
    urlpatterns += patterns('',
        url(r'^%s/(?P<pk>\d+)/$' % model.lower(), UpdateView.as_view(model=model)), name='edit-%s' % model.lower()),
    )

1 个答案:

答案 0 :(得分:1)

你是对的。此逻辑属于您的视图。

由于您正在使用基于类的视图,因此您可以将UpdateView子类化并使用自定义逻辑覆盖__init__()函数:

class MyUpdateView(UpdateView):
    template_name = 'edit_form.html'
    success_url = '/yay/'
    context_object_name = 'object'

    def __init__(self, *args, **kwargs):
        super(MyUpdateView, self).__init__(*args, **kwargs)
        self.form_class = eval('%sForm' % self.model)