我的一个模型有一些选项可以控制它的表单显示方式。例如,自动生成客户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
答案 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__
代码是否值得,以避免有两个表单类。