Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Django动态类的泛型视图_Django_Django Class Based Views - Fatal编程技术网

基于Django动态类的泛型视图

基于Django动态类的泛型视图,django,django-class-based-views,Django,Django Class Based Views,我们有很多视图,它们利用简单的通用视图,我们在url.py中循环使用这些视图,并指向相同的基于函数的通用视图。现在,我们正转向基于类的通用视图,我们需要复制此功能,并被迫将所有逻辑移到url.py文件中,如下所示: GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',] for model in GENERIC_VIEWS_EDIT: urlpatterns += patte

我们有很多视图,它们利用简单的通用视图,我们在url.py中循环使用这些视图,并指向相同的基于函数的通用视图。现在,我们正转向基于类的通用视图,我们需要复制此功能,并被迫将所有逻辑移到url.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()),

    )
GENERIC_VIEWS_EDIT=['ModelOne'、'ModelTwo'、'ModelThree'、'ModelFour'、'ModelN'、]
对于常规视图中的模型,请编辑:
urlpatterns+=模式(“”,
url(r'^%s/(?P\d+)/$'%model.lower(),从不缓存(需要工作人员成员)(UpdateView.as\u视图(
模型=评估(模型),
上下文\u对象\u name='object',
form_class=eval(“%s窗体”%model),
模板\u name='edit\u form.html',
成功_url='/yay/'
))),name='edit-%s'%model.lower()),
)
虽然这样做很好,但我不屑将所有这些“查看代码”都放在url.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()),
    )
GENERIC_VIEWS_EDIT=['ModelOne'、'ModelTwo'、'ModelThree'、'ModelFour'、'ModelN'、]
对于常规视图中的模型,请编辑:
urlpatterns+=模式(“”,
url(r'^%s/(?P\d+)/$'%model.lower(),UpdateView.as_view(model=model)),name='edit-%s'%model.lower()),
)

你说得对。这种逻辑属于你的观点

由于您使用的是基于类的视图,因此只需将UpdateView子类化,并使用自定义逻辑覆盖
\uuuu init\uuuu()
函数即可:

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)

你说得对。这种逻辑属于你的观点

由于您使用的是基于类的视图,因此只需将UpdateView子类化,并使用自定义逻辑覆盖
\uuuu init\uuuu()
函数即可:

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)

这是一门课,这是一门课,这是一门课!我只需要不断地告诉自己这一点,它最终会被理解的。谢谢你,凯尔。重写self.get\u form\u类更容易。在这里,你只需返回表格classIt’s class,it’s class,it’s class!我只需要不断地告诉自己这一点,它最终会被理解的。谢谢你,凯尔。重写self.get\u form\u类更容易。在这里,您只需返回表单类