Python Django寄存器ModelForm与Model
我有几个MyModels,都是从同一个MyBaseModel派生的,每个模型都有一个从MyModelBaseForm派生的MyModelForm。 给定MyModelForm,我可以通过MyModelForm访问相关模型。 做相反的事情最简单的方法是什么:给定一个MyModel,获取相应的MyModelForm 原因是我想在视图中使用duck键入: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
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_工厂的完整文档如下: