【问题标题】:Django Meta Class Access Outer AttributeDjango 元类访问外部属性
【发布时间】:2016-03-13 20:35:13
【问题描述】:

伙计们,

我需要实现一个可能会因变量而略有不同的表单。我的子类 ModelForms 的类看起来像这样

class ConstantVwModelForm(forms.ModelForm):
  #couple attributes

  def __init__(self, hasData, *args, **kwargs): 

  class Meta:
    fields = ('xx', 'yy' ..)

我正在寻找从内部class Meta 访问变量hasData 的最佳方法,就像

class ConstantVwModelForm(forms.ModelForm):
  #couple attributes

  def __init__(self, hasData, *args, **kwargs): 

  class Meta:
    if hasData:
      fields = ('xx', 'yy', ..)
    else:
      fields = ('hh', ..)

非常感谢任何帮助

【问题讨论】:

    标签: python django python-2.7 django-forms inner-classes


    【解决方案1】:

    你不应该那样做,也没有办法做到这一点。您可以在 __init__ 函数中明确删除字段:

    class ConstantVwModelForm(forms.ModelForm):
        #couple attributes
        def __init__(self, hasData, *args, **kwargs):
            if hasData:
                del self.fields['hh']
            else:
                del self.fields['xx']
                del self.fields['yy']
    
        class Meta:
            model = ConstantVwModel
    

    【讨论】:

    • 尚,唯一的问题是我的class Meta中需要有我的模型变量。如果我将我的model = MyClass 保留在Meta 中并按照您所说的方式设置我的字段(在__init__ 内),django 会自动制作我的表单并显示所有字段,而忽略我的self.fields['xx'] = forms.CharField() 声明
    • 对不起,我更新了我的答案。我仍然认为最好不要以 django 形式编辑 Meta 类。我找到了另一种方法,可以让您的表单动态化而不会带来太多痛苦。
    • 很酷,但是我无法将字段设置为隐藏,对吧?因为我要从我的表单中删除它
    • “隐藏的字段”和“从表单中删除字段”是两个不同的东西。如果你把它隐藏起来,它只会隐藏在模板中。您可以使用任何一种方式,但如果您只隐藏字段,人们可以以某种方式操纵 html 或 POST 数据以将未经授权的数据发布到表单,这可能会导致问题。
    • 是的,我知道这种差异。我的意思是,如果我只能动态删除该字段,我可以动态设置一个字段的属性吗? IE。在我的__init__ 中将其设置为隐藏?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多