【问题标题】:Django ModelForm MetaDjango ModelForm 元
【发布时间】:2012-03-05 19:57:09
【问题描述】:

我想创建一个 ModelForm 类,其中模型是从视图传递的参数。(我想要一个动态表单,所以我可以通过更改 Meta 中的模型值来使用同一个 ObjectForm 类创建所有表单):

class ObjectForm(ModelForm):

    model_name = None

    def __init__(self, *args, **kwargs):
        model_name = kwargs.pop('model_name ')
        super(ModelForm, self).__init__(*args, **kwargs)

    class Meta:
        model = models.get_model('core', model_name )
        exclude = ("societe")

发生错误并说 model_name 不是全局字段。 请帮我解决这个问题。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的问题是类(和 Meta 类)是在编译时处理的,而不是在您实例化 ObjectForm 时。在编译时,模型名称是未知的。动态创建类是可能的,但有点复杂。幸运的是,django 开发人员已经为您完成了艰苦的工作:

    >>> from django.forms.models import modelform_factory
    >>> modelform_factory(MyModel)
    <class 'django.forms.models.MyModelForm'>
    

    更新

    所以你想要类似的东西

    def my_view(request):
        # ...
        MyForm = modelform_factory(MyModel)
        form = MyForm(request.POST) #  or however you would use a 'regular' form
    

    【讨论】:

    • 返回值为表单(类)
    【解决方案2】:

    好吧,您的基本错误是您将model_name 作为局部变量而不是作为模型实例访问。这是相当基本的 Python。

    但即使您解决了这个问题,它仍然无法正常工作。 Meta 类是在定义时通过元类的形式而不是在运行时进行评估的。您需要致电forms.models.modelform_factory - 如果您想定义一些标准验证和/或字段,您可以将您的模型表单子类传递给工厂。

    form_class = modelform_factory(MyModel, form=MyModelForm)
    

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多