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

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

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을 사용하고 있습니다.



답변

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

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


답변

이것은 당면한 질문을 건드리지 않지만이 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'


답변

다음을 수행 할 수도 있습니다. 양식 클래스 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- 튜플 목록이 있습니다. 도움이 되었기를 바랍니다.


답변

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


답변

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


답변

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

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

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


답변

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