当前位置:  开发笔记 > 编程语言 > 正文

动态更新ModelForm的Meta类

如何解决《动态更新ModelForm的Meta类》经验,为你挑选了2个好方法。



1> Daniel Naab..:

Meta类用于动态构造表单定义 - 因此,在您创建ModelForm实例时,不在排除中的字段已添加为新对象的属性.

执行此操作的常规方法是为每个可能的排除列表提供多个类定义.但是如果你希望表单本身是动态的,你必须动态创建一个类定义.就像是:

def get_form(exclude_list):
    class MyForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list
    return MyForm

form_class = get_form(('field1', 'field2'))
form = form_class()

更新:我刚刚重访这篇文章,并认为我会发布一个更惯用的方式来处理动态类:

def PassengerForm(exclude_list, *args, **kwargs):
    class MyPassengerForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list

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

    return MyPassengerForm()

form = PassengerForm(('field1', 'field2'))


+1:动态表单类构造.生病.
jujule:当然,只需在表单函数中添加一个位置参数:"def PassengerForm(exclude_list,model,*args,**kwargs)",并以与设置Meta.exclude相同的方式设置Meta.model字段.

2> user85461..:

其他方式:

class PassengerInfoForm(ModelForm):
    def __init__(self, *args, **kwargs):
        exclude_list=kwargs.pop('exclude_list', '')

        super(PassengerInfoForm, self).__init__(*args, **kwargs)

        for field in exclude_list:
            del self.fields[field]

    class Meta:
        model = Passenger

form = PassengerInfoForm(exclude_list=['field1', 'field2'])


您应该使用{} .pop()而不是设置它然后删除它.exclude_list = kwargs.pop('exclude_list')保存一行代码.*耸肩*
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有