动态更新 ModelForm 的 Meta 类 [英] Dynamically update ModelForm's Meta class

查看:24
本文介绍了动态更新 ModelForm 的 Meta 类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望从我的角度动态更新 ModelForm 的内联 Meta 类.尽管此代码似乎更新了 Meta 类中的排除列表,但 as_p()as_ul() 等的输出并未反映更新后的 Meta 排除.

我假设 html 是在创建 ModelForm 时生成的,而不是在调用 as_*() 时生成的.有没有办法强制更新 HTML?

这是最好的方法吗?我只是假设这应该工作.

想法?

from django.forms import ModelForm从 testprogram.online_bookings.models 导入乘客类PassengerInfoForm(ModelForm):def set_form_excludes(self, exclude_list):self.Meta.exclude = excludes_list元类:模型 = 乘客排除 = []

解决方案

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

通常的做法是为每个可能的排除列表设置多个类定义.但是,如果您希望表单本身是动态的,则必须即时创建一个类定义.类似的东西:

def get_form(exclude_list):类 MyForm(ModelForm):元类:模型 = 乘客排除 = exclude_list返回我的表格form_class = get_form(('field1', 'field2'))form = form_class()

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

defPassengerForm(exclude_list, *args, **kwargs):类 MyPassengerForm(ModelForm):元类:模型 = 乘客排除 = exclude_listdef __init__(self):super(MyPassengerForm, self).__init__(*args, **kwargs)返回 MyPassengerForm()form =PassengerForm(('field1', 'field2'))

I am hoping to dynamically update a ModelForm's inline Meta class from my view. Although this code seems to update the exclude list in the Meta class, the output from as_p(), as_ul(), etc does not reflect the updated Meta exclude.

I assume then that the html is generated when the ModelForm is created not when the as_*() is called. Is there a way to force the update of the HTML?

Is this even the best way to do it? I just assumed this should work.

Thoughts?

from django.forms import ModelForm

from testprogram.online_bookings.models import Passenger

class PassengerInfoForm(ModelForm):

    def set_form_excludes(self, exclude_list):
        self.Meta.exclude = excludes_list

    class Meta:
        model = Passenger
        exclude = []

解决方案

The Meta class is used to dynamically construct the form definition - so by the time you've created the ModelForm instance, the fields not in the exclude have already been added as the new object's attributes.

The normal way to do it would be to just have multiple class definitions for each possible exclude list. But if you want the form itself to be dynamic, you'll have to create a class definition on the fly. Something like:

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()

UPDATE: I just revisited this post and thought I'd post a little more idiomatic way to handle a dynamic 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'))

这篇关于动态更新 ModelForm 的 Meta 类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆