【问题标题】:Dynamically update ModelForm’s Meta class model field动态更新 ModelForm 的 Meta 类模型字段
【发布时间】:2011-01-15 09:29:57
【问题描述】:
def SiteAdminForm(model_cls, *args, **kwargs):
    class MerchantAdminForm(forms.ModelForm):
        class Meta:
            exclude = ('external_links', 'published', 'logo','image_zip_file',)
            model = model_cls

        def __init__(self, *args, **kwargs):
            super(MerchantAdminForm, self).__init__(*args, **kwargs)

    return MerchantAdminForm()

# In use...
merchant_form = SiteAdminForm(merchant.__class__, instance=merchant)

无论将什么传递给model_cls,模型总是被忽略。

Meta.exclude设置正确,如何动态更新Meta.model

【问题讨论】:

    标签: python django dynamic model modelform


    【解决方案1】:

    那是因为您的merchant.__class__ 也是django.db.models.base.ModelBase。如果您只是尝试打印商家,那么您将获得正确的类路径(我得到app.models.TestModel),但 class 是 BaseModel。

    我相信这是因为元类的使用。可能元类将对象的类设置为 ModelBase。 Django 广泛使用这个 python 特性,这可能会导致一些奇怪的行为(这对人们来说很奇怪,像我一样不完全理解它;-),而不是它不起作用)。我会尝试看看 django 代码 - 你也应该:-)

    不管怎样,你在表单中得到了你想要的,它应该可以正常工作:-)

    该死

    我当然知道,为什么会这样。你在问一个班级的班级,你知道的。 form.Meta.model 内部是一个类,是您传递给表单的类。这就是您获得 ModelBase 的原因 - 您获得了元类。

    有关元类的内容值得一读,因为它们很酷。虽然它们也有点复杂 ;-) Here 你可以阅读它们。

    【讨论】:

      【解决方案2】:

      尝试这样使用:

      merchant_form = SiteAdminForm(merchant.model, instance=merchant)
      

      一个建议是使用 Python shell(在 django 案例中为 ./manage.py shell)通过内置的 dir() 函数检查对象的属性和方法。

      【讨论】:

        【解决方案3】:

        我是个白痴,睡在上面,又看了一遍,几乎立刻就明白了!!!!

        return MerchantAdminForm() 应该是:return MerchantAdminForm(*args, **kwargs)

        【讨论】:

          【解决方案4】:
          def get_form(model_class):
              class DynamoForm(forms.ModelForm):
                  class Meta:
                      model = model_class
          
              return DynamoForm
          
          
          form_set = get_form(ActualModel)(request.POST)
          

          这就是你想要的吗?

          【讨论】:

          • 你是超级巨星!令人难以置信的通用解决方案!
          猜你喜欢
          • 2010-09-22
          • 2016-07-09
          • 1970-01-01
          • 2017-10-22
          • 1970-01-01
          • 2020-12-10
          • 2022-01-23
          • 2012-02-02
          • 2011-03-03
          相关资源
          最近更新 更多