Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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
Python Django寄存器ModelForm与Model_Python_Django_Metaclass_Modelform - Fatal编程技术网

Python Django寄存器ModelForm与Model

Python Django寄存器ModelForm与Model,python,django,metaclass,modelform,Python,Django,Metaclass,Modelform,我有几个MyModels,都是从同一个MyBaseModel派生的,每个模型都有一个从MyModelBaseForm派生的MyModelForm。 给定MyModelForm,我可以通过MyModelForm访问相关模型。 做相反的事情最简单的方法是什么:给定一个MyModel,获取相应的MyModelForm 原因是我想在视图中使用duck键入: from django.db import models def edit_view(request, my_model_name, pk=Non

我有几个MyModels,都是从同一个MyBaseModel派生的,每个模型都有一个从MyModelBaseForm派生的MyModelForm。 给定MyModelForm,我可以通过MyModelForm访问相关模型。 做相反的事情最简单的方法是什么:给定一个MyModel,获取相应的MyModelForm

原因是我想在视图中使用duck键入:

from django.db import models

def edit_view(request, my_model_name, pk=None):
    my_model = my_model_registry[my_model_name]
    instance = get_object_or_404(my_model, pk=pk) if pk else None
    my_model_form = my_model._meta.modelform 
    # or my_model_form = my_model_form_registry[my_model]
    form = my_model_form(request.POST or None, instance=instance)
    if form.is_valid():
        instance = form.save()
        return HttpResponseRedirect(instance.get_absolute_url())
    return render(request, 'my_template', {'form': form, 'instance': instance})

my_model_registry = dict( (Model._meta.verbose_name, Model) for Model in
                          models.get_models() if issubclass(Model, MyBaseModel)
                          )
理想的解决方案是有一个字典
my_model\u form\u registry[my_model]
,这样我就可以像查找模型一样查找表单。我知道我可以通过显式设置

my_model_form_registry[MyModelForm._meta.model] = MyModelForm
在每个MyModelForm定义之后,但本着DRY的精神,我想对ModelBaseForm执行一次,并让它对所有派生模型自动执行

元类可以做到这一点,但我无法实现这一点,因为model.ModelForm已经有了一个特殊的元类


另一个选项是,如果存在与
models.get_models
等效的模型,但不适用于modelforms。这是否存在?

django.forms.models中有一个函数,该函数在给定模型类的情况下动态构造一个ModelForm类,听起来它可以做您想要的事情。

django.forms.models中有一个函数,该函数在给定模型类的情况下动态构造一个ModelForm类,听起来它可以做你想做的。

django.forms.models中有一个函数,它在给定模型类的情况下动态构造一个ModelForm类,听起来它可以做你想做的事。

django.forms.models中有一个函数在给定一个模型类的情况下动态构造一个ModelForm类,听起来它可以做你想做的事。

我想我已经找到了如何将元类添加到MyModelBaseForm中的方法 这样就可以做到:

class MyModelBaseForm(forms.ModelForm):

    class __metaclass__(forms.ModelForm.__metaclass__):
        """
        Metaclass to register the modelform with the model, 
        as model._meta.modelform.
        """                

        def __init__(cls, name, bases, dic):
            super(__metaclass__, cls).__init__(cls, name, bases, dic)
            cls._meta.model._meta.modelform = cls

    class Meta:
        model = MyBaseModel
        fields = [ ... ]

我想我已经找到了向MyModelBaseForm添加元类的方法 这样就可以做到:

class MyModelBaseForm(forms.ModelForm):

    class __metaclass__(forms.ModelForm.__metaclass__):
        """
        Metaclass to register the modelform with the model, 
        as model._meta.modelform.
        """                

        def __init__(cls, name, bases, dic):
            super(__metaclass__, cls).__init__(cls, name, bases, dic)
            cls._meta.model._meta.modelform = cls

    class Meta:
        model = MyBaseModel
        fields = [ ... ]

我想我已经找到了向MyModelBaseForm添加元类的方法 这样就可以做到:

class MyModelBaseForm(forms.ModelForm):

    class __metaclass__(forms.ModelForm.__metaclass__):
        """
        Metaclass to register the modelform with the model, 
        as model._meta.modelform.
        """                

        def __init__(cls, name, bases, dic):
            super(__metaclass__, cls).__init__(cls, name, bases, dic)
            cls._meta.model._meta.modelform = cls

    class Meta:
        model = MyBaseModel
        fields = [ ... ]

我想我已经找到了向MyModelBaseForm添加元类的方法 这样就可以做到:

class MyModelBaseForm(forms.ModelForm):

    class __metaclass__(forms.ModelForm.__metaclass__):
        """
        Metaclass to register the modelform with the model, 
        as model._meta.modelform.
        """                

        def __init__(cls, name, bases, dic):
            super(__metaclass__, cls).__init__(cls, name, bases, dic)
            cls._meta.model._meta.modelform = cls

    class Meta:
        model = MyBaseModel
        fields = [ ... ]

这适用于简单的模型表单,但在我的例子中,我希望模型表单从MyModelBaseForm派生出一些附加功能,这些功能在clean_字段和clean方法中定义。如该链接所示,您可以将现有表单类传递给modelform_工厂。您是对的,它出现在示例中。关于modelform_factory的完整文档如下:这适用于简单的模型表单,但在我的例子中,我希望模型表单从MyModelBaseForm派生出一些附加功能,在clean_字段和clean方法中定义。如该链接所示,您可以将现有表单类传递给modelform_factory。您是对的,它出现在示例中。关于modelform_factory的完整文档如下:这适用于简单的模型表单,但在我的例子中,我希望模型表单从MyModelBaseForm派生出一些附加功能,在clean_字段和clean方法中定义。如该链接所示,您可以将现有表单类传递给modelform_factory。您是对的,它出现在示例中。关于modelform_factory的完整文档如下:这适用于简单的模型表单,但在我的例子中,我希望模型表单从MyModelBaseForm派生出一些附加功能,在clean_字段和clean方法中定义。如该链接所示,您可以将现有表单类传递给modelform_factory。您是对的,它出现在示例中。modelform_工厂的完整文档如下: