Django 양식에서 선택한 값 설정 .ChoiceField


106

다음은 양식의 필드 선언입니다.

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

초기 값을로 설정하고 싶지만 3작동하지 않는 것 같습니다. 나는 param, quotes / no quotes 등을 가지고 놀았지만 변화는 없습니다.

가능하다면 누구든지 저에게 확실한 답을 줄 수 있습니까? 그리고 / 또는 내 코드 스 니펫에서 필요한 조정은?

Django 1.0을 사용하고 있습니다.


나는 똑같은 것을 궁금해하고 있습니다. "초기"는 최신 트렁크 버전에서도 선택 사항과 함께 작동하지 않습니다.
Ty.

답변:


114

양식을 인스턴스화 할 때 초기 값을 설정해보십시오.

form = MyForm(initial={'max_number': '3'})

3
가요 '3'튜플이나 제의 값에 대응하는 제?
Bestasttung 2017 년

4
튜플은 옵션에 대한 (값, 레이블) 쌍을 나타내며 초기 값을 지정하려고합니다. 따라서 '3'은 첫 번째 항목을 나타냅니다.
Tom

95

이것은 당면한 질문을 건드리지 않지만이 Q / A는 선택한 값을 ChoiceField .

super().__init__Form 클래스에서 이미 호출 한 form.initial경우 field.initial속성이 아닌 사전을 업데이트해야 합니다. 공부하는 경우 form.initial(예 : print self.initial를 호출 한 후 super().__init__) 모든 필드에 대한 값이 포함됩니다 . None해당 dict에 값이 있으면field.initial .

예 :

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'

3
이 대답을 이해하지 않는 경우,이 읽기 장고 양식의 개는을
ChillarAnand

1
이 답변이 너무 오래되어 더 이상 작동하지 않기 때문에인지 확실하지 않지만이 솔루션을 작동시킬 수는 없습니다. 위의 모든 조합을 시도했지만 여전히 사랑을 얻지 못했습니다. 여기에서이 질문을 다시했습니다 : stackoverflow.com/questions/52191096/… 대답이 여전히 같으면 내 코드에 무엇이 잘못되었는지 알려주십시오. 감사합니다!
Lehrian

48

다음을 수행 할 수도 있습니다. 양식 클래스 def :

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

그런 다음보기에서 양식을 호출 할 때 초기 선택과 선택 목록을 모두 동적으로 설정할 수 있습니다.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

참고 : 초기 값은 목록이어야하고 선택 항목은 2- 튜플이어야합니다. 위의 예에서는 2- 튜플 목록이 있습니다. 도움이 되었기를 바랍니다.


5
의 값이 initial색인이 아니라 선택할 항목의 키를 참조 한다는 점에 주목할 가치가 있습니다. 이 문제를 해결하기 위해 몇 번의 시도를했습니다!
BigglesZX 2014

20

나는이 문제도 만났고 문제가 브라우저에 있다는 것을 알아 냈다. 새로 고치면 브라우저가 이전과 동일한 값으로 양식을 다시 채우고 선택된 필드를 무시합니다. 소스를 보면 확인 된 값이 올바른지 확인할 수 있습니다. 또는 브라우저의 URL 필드에 커서를 놓고 Enter 키를 누르십시오. 양식을 처음부터 다시로드합니다.


1
참고로, 이것은 여전히 ​​FF6에서 발생합니다. 새로 고침 버튼을 누르는 것만으로는 충분하지 않습니다. 크롬 새로 고침 버튼을 충분 구글에서하지만, 필요는 주소 표시 줄로 이동 없습니다
MHD

1
나는 항상 Firefox에서 일어날 것이라고 생각합니다. 의도 된 동작입니다.
thepeer

여전히 Chrome 83에서 발생합니다. 당신은 내 생명을 구했습니다!
lapin

7

Tom과 Burton의 답변은 결국 저에게 효과가 있었지만 어떻게 적용 할 것인지를 ModelChoiceField .

유일한 트릭은 선택 항목이의 튜플로 저장된다는 것입니다 (<model's ID>, <model's unicode repr>). 따라서 초기 모델 선택을 설정 하려면 객체 자체 나 이름 또는 기타 항목이 아닌 모델의 ID 를 초기 값으로 전달합니다 . 그러면 다음과 같이 간단합니다.

form = EmployeeForm(initial={'manager': manager_employee_id})

또는 다음 initial과 같이 추가 행 대신 인수를 무시할 수 있습니다.

form.fields['manager'].initial = manager_employee_id

1
두 번째 코드 줄은 GET요청 후 양식의 초기 값을 설정하고보기 내에서 설정 해야하는 드문 경우 중 하나에서 완벽하게 작동 합니다.
kstratis

3

Dave-브라우저 문제에 대한 해결책을 찾는 행운이 있습니까? 강제로 새로 고침하는 방법이 있습니까?

원래 문제는 양식을 초기화 할 때 다음을 시도하십시오.

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

1
보기 좋지 않습니다. django 1.3, forms.py:93에서 인용 :Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek 2013 년

1

양식을 어떻게 렌더링하는지 확인해야합니다. 초기 값은 바인딩되지 않은 양식에서만 사용되며 바인딩되어 있고 해당 필드의 값이 포함되지 않은 경우 아무 것도 선택되지 않습니다.


-4

나를 위해 작동하는 이것을 시도하십시오. models.py에 이것을 추가했습니다.

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')

6
이 장고 1.8.1에 오류 제공 TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
줄리우 세자르 소아리스 이스핀 돌라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.