如何在Django中初始化Meta类的“模型”变量?

时间:2018-06-10 14:56:52

标签: python django django-models django-forms

这可能是Django或一般的python问题。我有一个ModelForm。根据用户输入,我需要使用一个模型或另一个模型。例如,如果输入为'M',我需要将他的表单与MaleTable相关联,否则将其与FemaleTable相关联。我可以创建2个ModelForms

class DemographicM (ModelForm):
    class Meta:
        model = MaleTable

class DemographicF (ModelForm):
    class Meta:
        model = FemaleTable

但是,我想只使用一个ModelForm并根据输入使用正确的模型对其进行初始化。

我知道Meta只是一个内部阶级。如何在创建表单时初始化'model'变量?

2 个答案:

答案 0 :(得分:0)

我建议保留它们并在视图中使用它们

if choice == 'M':
    TableForm = DemographicM
else:
    TableForm = DemographicF

form = TableForm()

答案 1 :(得分:0)

对于一个元类,它的实例是一个类本身。因此,解决方案是使用函数随时创建类。像下面这样的东西会起作用:

MODEL = None
def define_meta_attributes(model):
  global MODEL
  MODEL = model
def make_form_class(*args, **kwargs):
  class Demographic (ModelForm):
    class Meta:
      model = MODEL
  return Demographic(*args, **kwargs)

现在,您要做的就是首先使用所需的模型调用define_meta_attributes,然后再调用make_form_class,如下所示:

define_meta_attributes(MaleTable)
MaleTableForm = make_form_class()