2012-07-21 3 views
6

일부 옵션으로 선택 필드를 만들려면 choiceField이 있습니다. 이런 식으로 뭔가 :Django의 동적 선택 필드 사용

forms.py 
    class NewForm(forms.Form): 
     title = forms.CharField(max_length=69) 
     parent = forms.ChoiceField(choices = CHOICE) 

하지만 (ChoiceField에 필요한) 미리 정의 된 튜플을하지 않고 옵션을 만들 수 있어야합니다. 기본적으로, 각 사용자에 따라 몇 가지 옵션 태그를 채우기 위해 request.user에 대한 액세스 권한이 필요하지만 form.Form 클래스에서 요청을 사용할 수있는 방법이 있는지 여부는 알 수 없습니다.

대안을 통해 NewForm의 인스턴스를 미리 채울하는 것입니다 :

views.py 
form = NewForm(initial={'choices': my_actual_choices}) 

하지만 난 NEWFORM과 my_actual_choices 어쨌든 작동하지 않는 것 만들 더미의 선택을 추가해야합니다.

이 문제를 해결하는 세 번째 방법은 ChoiceField의 하위 클래스를 만들고 save()을 재정의하는 것이라고 생각하지만이 작업을 수행하는 방법을 잘 모르겠습니다.

당신은 초기화를 재정 의하여 동적으로 채울 수 있습니다

답변

7

는, 기본적으로 코드는 다음과 같이 표시됩니다

class NewForm(forms.Form): 
    def __init__(self, choices, *args, **kwargs): 
     super(NewForm, self).__init__(*args, **kwargs) 
     self.fields["choices"] = forms.ChoiceField(choices=choices) 

NewForm(my_actual_choices) 또는 NewForm(my_actual_choices, request.POST, request.FILES)

+0

예, 작동합니다. 감사합니다 –

+1

'super()'가 먼저 와야합니다. – Surya

+0

생성자 앞에서'super()'를 보았을 때 혼란 스러웠습니다.하지만 시도해 보았을 때 'self'라는 이름이 정의되지 않았습니다. 'super()'가 생성자에 있어야합니다. 편집 기록을 살펴보면 수어 (Surya)가 의미하는 바는'super()'가 원래 생성자의 마지막 줄 이었기 때문이라고 생각합니다. – user2233706