2009-04-10 6 views
5

의 선택을 수정하는 방법 :의 내가 어떤 인위적인 모델을 가지고 있다고 가정 해 봅시다 ModelMultipleChoiceField

class Author(Model): 
    name = CharField() 

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

과의 내가 책에 대한 ModelForm를 사용하고 싶은 말은하자

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

간단한 지금까지. 그러나 데이터베이스에 저자가 많다고 말하면 많은 선택 필드를 갖고 싶지 않습니다. 그래서 BookForm의 ModelMultipleChoiceField 작성자 필드에서 쿼리 세트를 제한하는 것이 좋습니다. 전달하고자하는 쿼리에 의존하기 때문에 원하는 쿼리 세트가 __init__까지 선택 될 수 없다고 가정 해 봅시다. 그건 그냥 내가 여기되지 않을 것 일 경우, 물론

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 

: 그것은 트릭을 할 수있는 것처럼

이 보인다. 그게 나에게 AttributeError를 가져온다. 'BookForm'개체에 'author'속성이 없습니다. 같은 결과를

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

    class Meta: 
     model = Book 

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

: 그래서, 나 또한 내가 ModelForm의 기본 필드를 무시하고 나중에 그것을 설정하려고 이런 식으로 뭔가를 시도했다.

누구에게 어떻게 해야할지 알고 있습니까? 속성, 당신은 사전 인 "필드"속성에서 볼 필요로

답변

8

양식 객체는 자신의 분야가 없습니다 :

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

완전히 여기에 무슨 일이 일어나고 있는지 이해하려면, this answer에 관심이있을 수 있습니다. 모델에 관한 것이지만 Forms는 비슷하게 작동합니다.

7

Carl이 필드에 대해 올바르지 만 수퍼 클래스 호출도 누락되었습니다. 이것은 내가하는 일입니다 :

+0

예, 실제 문제 영역에는 수퍼 클래스 호출이 있지만이 예제에서는 건너 뛰었습니다. – Brian

+0

충분합니다. 나는 이것을 참고로이 질문에 방황하는 사람들에게 맡기겠다. –

+1

확실히. 필드에 액세스하기 전에 super() .__ init __()을 수행해야한다는 것을 알아야합니다. – Brian

관련 문제