2012-07-21 4 views
6

Bazı seçenekler içeren bir seçim alanı oluşturmak için choiceField kullanıyorum. Böyle bir şey:Django'da dinamik seçim alanını kullanma

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

Ama (ChoiceField tarafından gereklidir) önceden tanımlanmış bir başlığın kalmadan seçenekleri oluşturmak isterler. Temel olarak, her bir kullanıcıya göre bazı seçenek etiketlerini doldurmak için request.user öğesine erişmem gerekiyor, ancak formların formlarında istek kullanılmasının herhangi bir yolu olup olmadığını bilmiyorum.Form.

alternatif aracılığıyla NewForm örneğini önceden doldurmak için olacaktır:

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

ama NewForm ve my_actual_choices yine de iş görünmüyor oluşturmak için bir kukla SEÇİM eklemek zorunda.

Bunu çözmenin üçüncü bir yolu, bir ChoiceField alt sınıfı oluşturmak ve save() yeniden tanımlamaktır ancak bunu yapmak için nasıl gideceğimi bilmiyorum.

Sen init geçersiz kılarak dinamik şekilde doldurabileceğinden

cevap

7

temelde kod gibi görünecektir:

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) veya NewForm(my_actual_choices, request.POST, request.FILES) vb

+0

Evet, onlar olur. Teşekkürler –

+1

'super()' önce gelmelidir. – Surya

+0

Kurucudan önce super() 'yi gördüğümde kafam karıştı, ama denediğimde bir hata aldım: isim 'self' tanımlanmadı. 'super()' kurucuda olmalı. Düzenleme geçmişine baktığımda, Surya'nın ne anlama geldiğini düşünüyorum, çünkü super() 'başlangıçta kurucunun son satırı. – user2233706