2014-07-23 1 views
0

내 모델 중 하나는 양식이 표시되는 방식을 제어 할 수있는 몇 가지 옵션이 있습니다. 예를 들어 자동으로 고객 ID를 생성합니다. 지금은 고객 ID 필드에 대해서만 다른 제외 목록을 제외하고 완전히 똑같은 두 가지 형식이 정의되었습니다.Django의 get_form_kwargs를 사용하여 form.exclude []를 수정 하시겠습니까?

나는 그것을 수정하기 위해 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 

답변

2

exclude 옵션은 특정 모델 필드는 클래스 정의 동안 양식 필드 로 생성되는 것을 방지하기 위해 metaclass에 의해 사용된다. 클래스가 정의 된 후에 변경하면 아무 효과가 없습니다.

get_form_kwargs은 양식 인스턴스를 인스턴스화하기위한 인수를 제공합니다. 정의에 따르면 클래스는 kwargs 형식이 제공되기 전에 정의되었으므로 exclude을 kwargs 형식으로 변경하면 아무 효과가 없습니다.

해결 방법은 __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__ 코드는 두 가지 형태의 클래스를 피하기 위해 가치가 있다면 당신은 결정해야합니다.

+0

와우. 그것은 놀라 울 정도로 잘 작동했습니다. 발췌 문장을 약간 수정하면 실행됩니다. 감사! – meteorainer

관련 문제