1

Django docs.에 따르면 ChoiceField는 an iterable of two tuples, "or a callable that returns such an iterable"을 필드의 선택 항목으로 사용합니다.보기에서 양식의 ChoiceField에 사용자 지정 "선택 사항"을 전달하려면 어떻게합니까?

내 형태에서 ChoiceFields을 정의했습니다 : 여기, 내 models.py

class PairRequestView(FormView): 
    form_class = PairRequestForm 

    def get_initial(self): 
     requester_obj = Profile.objects.get(user__username=self.request.user) 
     accepter_obj = Profile.objects.get(user__username=self.kwargs.get("username")) 

     # `get_favorites()` is the object's method which returns a tuple. 
     favorites_set = requester_obj.get_favorites() 

     initial = super(PairRequestView, self).get_initial() 

     initial['favorite_choices'] = favorites_set 

     return initial 

입니다 : 여기

class PairRequestForm(forms.Form): 
    favorite_choices = forms.ChoiceField(choices=[], widget=RadioSelect, required=False) 

내가 정의 선택의 튜플을 통과하려고 해요이다 위에서 사용 된 튜플을 반환하는 메서드는 다음과 같습니다.

def get_favorites(self): 
     return (('a', self.fave1), ('b', self.fave2), ('c', self.fave3)) 

내 이해에서 양식을 미리 채우려면 get_initial()을 재정 의하여 데이터를 전달합니다. 나는 폼의 favorite_choices의 초기 데이터를 호출 가능하도록 설정하려고 시도했다. 호출 가능 번호는 favorites_set입니다.

현재 코드와

, 나는 'tuple' object is not callable

의 오류 부여하고 내가 어떻게 미리 채울 내 자신의 선택으로 RadioSelect ChoiceField를?

편집 : 나는 또한 get_initial 방법은 양식의 필드의 초기 값을 채우기 위해 만들어 initial['favorite_choices'].choices = favorites_set

답변

1

설정을 시도했습니다. 사용 가능한 문자를 choices으로 설정하거나 필드 속성을 수정하지 마십시오.

성공적 형태로보기에서 선택 사항을 전달하기 위해, 당신은 당신의보기에서 get_form_kwargs 메소드를 구현해야합니다
class PairRequestView(FormView): 
    form_class = PairRequestForm 

    def get_form_kwargs(self): 
     """Passing the `choices` from your view to the form __init__ method""" 

     kwargs = super().get_form_kwargs() 

     # Here you can pass additional kwargs arguments to the form. 
     kwargs['favorite_choices'] = [('choice_value', 'choice_label')] 

     return kwargs 

그리고 당신의 형태로

에서, __init__ 방법에 kwargs로 인수의 선택을받을 필드에 선택 항목을 설정하십시오.

class PairRequestForm(forms.Form): 

    favorite_choices = forms.ChoiceField(choices=[], widget=RadioSelect, required=False) 

    def __init__(self, *args, **kwargs): 
     """Populating the choices of the favorite_choices field using the favorites_choices kwargs""" 

     favorites_choices = kwargs.pop('favorite_choices') 

     super().__init__(*args, **kwargs) 

     self.fields['favorite_choices'].choices = favorites_choices 

그리고 voilà!

+0

'self.fields []. choices'를 편집하기 전에'super() .__ init __()'호출을하는 특별한 이유가 있습니까? – Homer

+1

이전에'__init__'를 호출하지 않으면'fields' 속성이 정의되지 않습니다. 'fields' 속성은'BaseForm' init 메소드에 정의되어 있습니다 : https://github.com/django/django/blob/master/django/forms/forms.py#L95 –