2009-04-10 15 views
5

ait Seçimleri değiştirme nasılen Bazı yapmacık modelleri var diyelim ModelMultipleChoiceField

class Author(Model): 
    name = CharField() 

class Book(Model): 
    title = CharField() 
    author = ForeignKey(Author) 

Ve ı Defteri için bir ModelForm kullanmak istediğiniz diyelim:

class BookForm(ModelForm): 
     class Meta: 
     model = Book 

Basit şimdiye kadar. Fakat şunu da söyleyeyim, veritabanımda bir ton Yazar var ve ben böyle uzun bir çoktan seçmeli alana sahip olmak istemiyorum. Öyleyse, BookForm'un ModelMultipleChoiceField yazarlık alanındaki sorgulamayı kısıtlamak istiyorum. Ayrıca istediğim queryset'in, iletilecek bir argümana dayandığı için __init__'a kadar seçilemeyeceğini de söyleyelim. bu sadece ben burada olmazdım çalıştı eğer, Elbette

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

    def __init__(self, letter): 
     # returns the queryset based on the letter 
     choices = getChoices(letter) 
     self.author.queryset = choices 

: Bu hile yapabilir gibi

Bu gibi görünüyor. Bu bana bir AttributeError verir. 'BookForm' nesnesinin 'author' özelliği yoktur. aynı sonucu üretir

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, letter): 
     choices = getChoices(letter) 
     self.author.queryset = choices 

: Yani, Ben de ModelForm varsayılan alanını geçersiz kılmak ve daha sonra ayarlamak için denemek böyle bir şey denedik.

Bunun nasıl yapılmasının amaçlandığını bilen var mı? nitelikleri, bir sözlük olan "alanları" özelliğiyle de bakmak gerekir olarak

cevap

8

Form nesneleri kendi alanlarını yok:

self.fields['author'].queryset = choices 

tam burada neler olup bittiğini anlamak istiyorsanız, this answer ile ilgilenebilir - bu Modellerle ilgilidir, ancak Formlar benzer şekilde çalışır.

7

Carl alanlarla ilgili doğru olmasına rağmen, aynı zamanda süper bir sınıf aramasını da kaçırıyorsunuz. Ben böyle yaparım:

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, *args, **kwargs): 
     letter = kwargs.pop('letter') 
     super(BookForm, self).__init__(*args, **kwargs) 
     choices = getChoices(letter) 
     self.fields['author'].queryset = choices 
+0

Evet, gerçek sorun alanım süper sınıf çağrısına sahip, ancak bu örnek için atladım. – Brian

+0

Yeterince adil. Bunu, bu sorunun cevabını gezen herkes için terkedeceğim, sanırım. –

+1

Kesinlikle. Super() .__ init __() öğesinin alanlara erişimden önce gerçekleşmesi gerektiğini görmek önemlidir. – Brian

İlgili konular