2011-04-21 5 views
3

왜 이것이 가능하지 않습니까?
다른 방법으로 데이터를 클래스 Test에 전달하는 목표를 달성 할 수 있습니까?
미리 감사드립니다.장고 양식에 데이터 전달하기

+1

문서를 자세히 읽었습니까? http://docs.djangoproject.com/en/1.3/topics/forms/ – Nacho

답변

9

이것은 기본적인 파이썬 문제입니다. 이러한 명령이 실행되는 순서와 범위에 대해 생각해 봐야합니다.

먼저 Test라는 폼 클래스를 정의합니다. 이 클래스에는 set_choices 메소드, get_choices 메소드 및 options 필드의 세 가지 속성이 있습니다. 이러한 정의는 클래스 자체가 정의 될 때 평가됩니다. options의 정의는 get_choices()입니다. 그러나 클래스가 아직 정의되지 않았으므로 그 시점에 범위에 get_choices 메소드가 없습니다.

options에 대한 선택 사항 정의가 정의 시간에 완료 되었기 때문에 어떻게 든 범위 문제를 분류해도이 작업은 원하는대로 수행되지 않습니다. 나중에 set_choices을 호출하더라도 options의 값은 필드 정의시 반환 된 get_choices의 값을 유지합니다.

그래서 실제로 무엇을하고 싶습니까? options 입력란에 동적 선택을 설정하려는 것 같습니다. 따라서 __init__ 메서드를 재정 의하여 정의해야합니다. __init__ 확장

class Test(forms.Form): 
    options = forms.ChoiceField(choices=()) 

    def __init__(self, *args, **kwargs): 
     choices = kwargs.pop('choices', None) 
     super(Test, self).__init__(*args, **kwargs) 
     if choices is not None: 
      self.fields['options'].choices = choices 
+0

보기에서 테스트 양식을 사용할 때 어떻게 이러한 선택 사항을 전달합니까? –

+0

당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 그러나 5 년 전의 대답에 대해 논평하는 것이 아니라 새로운 질문을해야합니다. –

0

다니엘 Roseman가 his answer에 대해 설명 동적 ChoiceField에 옵션을 추가 할 수있는 좋은 방법입니다.

그냥 추가하십시오 ... 런타임에 옵션 추가 hackish (기껏해야)입니다. 필요하지 않게 리스트 나 튜플 -

마지막으로, 선택은 어떤 반복 가능한 객체가 될 수 있습니다 - 여기 노트 (직선 Django ChoiceField documentation에서)에 대한 모범 사례입니다. 이를 통해 선택 사항을 동적으로 구성 할 수 있습니다. 그러나 자신이 해킹하는 선택 사항이 일 경우 ForeignKey가있는 적절한 데이터베이스 테이블을 사용하는 것이 좋습니다. 선택 사항은 많은 경우 바뀌지 않는 정적 데이터, (있는 경우)을 의미합니다.

관련 문제