问题 django表单在init上而不是在meta类中排除字段


我想根据传入的参数排除模型的init函数中的某些字段,我该怎么做?我知道我可以使用模型表单的元类添加排除字段,但我需要根据传入的变量进行动态处理。

谢谢


10433
2018-05-13 11:50


起源



答案:


你可以修改 self.fields 打电话后列表 super


10
2018-05-13 11:52



那么我需要输入什么呢?例如,如果我想从模型中删除字段'name' - John
if 'name' in self.fields: del self.fields['name'] - KillianDS


答案:


你可以修改 self.fields 打电话后列表 super


10
2018-05-13 11:52



那么我需要输入什么呢?例如,如果我想从模型中删除字段'name' - John
if 'name' in self.fields: del self.fields['name'] - KillianDS


您应该使用modelform_factory动态创建表单并传入要排除的字段。

def django.forms.models.modelform_factory   (       
     model,
    form = ModelForm,
    fields = None,
    exclude = None,
    formfield_callback = lambda f: f.formfield()     
)   

所以像

modelform_factory(MyModel, MyModelForm, exclude=('name',))

2
2018-03-27 05:07





你应该用 self._meta 代替 self.Meta,因为 ModelForm.__new__ 方法获取属性表单 self.Meta 把它们放进去 self._meta


2
2018-03-06 07:41





相关,为了从子类中排除字段,我已经扩展了ModelForm类,如下所示:

 class ModelForm(djangoforms.ModelForm):
   def __init__(self, *args, **kwargs):
     super(ModelForm, self).__init__(*args, **kwargs)

     meta = getattr(self, 'Meta', None)
     exclude = getattr(meta, 'exclude', [])

     for field_name in exclude:
       if field_name in self.fields:
         del self.fields[field_name]

1
2017-11-21 19:38





需要注意的是:如果从ModelAdmin类调用表单,只需为ModelAdmin创建一个get_form方法:

def get_form(self, request, obj=None, **kwargs):
    exclude = ()

    if not request.user.is_superuser:
        exclude += ('field1',)

    if obj:
        exclude += ('field2',)

    self.exclude = exclude
    return super(ProfessorAdmin, self).get_form(request, obj, **kwargs)

PS:通过方法“所有者”类改变ProfessorAdmin。


0
2017-09-20 11:10





我是这样做的:

class Meta:
    exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at']

0
2018-02-11 12:17