使用Django的get_form_kwargs修改form.exclude []?

时间:2014-07-23 20:03:16

标签: python django forms kwargs

我的一个模型有一些选项可以控制它的表单显示方式。例如,自动生成客户ID。现在我定义了两种不同的形式,除了排除列表之外完全相同,排除列表本身仅对客户ID字段不同。

我以为我可以使用get_form_kwargs来修改它,但它似乎没有那样工作。

有没有办法让这种情况发生,或者我是否坚持使用单独的表格?不是很干。


get_form_kwargs

def get_form_kwargs(self):
    kwargs = super(CustomerCreateView, self).get_form_kwargs()

    if not self.request.user.company.generate_account_numbers:
        kwargs['exclude'].extend('customer_id')
    return kwargs

1 个答案:

答案 0 :(得分:2)

exclude使用metaclass选项来防止在类定义期间将某些模型字段生成为表单字段。在定义类之后更改它没有任何效果。

get_form_kwargs提供了实例化表单实例的参数。根据定义,在提供表单kwargs之前已经定义了类,因此以kwargs形式更改exclude无效。

解决方法是覆盖__init__方法,并在传递某个参数时手动删除已生成的customer_id字段。

class CustomerForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        exclude_customer_id = kwargs.pop(exclude_customer_id, False):
        super(CustomerForm, self).__init__(*args, **kwargs)
        if exclude_customer_id:
            del self.fields['customer_id']

您必须确定额外的__init__代码是否值得,以避免有两个表单类。