2017-02-26 7 views
1

보기보기 : 고정 된 값 (2005라고 말함)부터 현재 연도까지의 드롭 다운 목록을 표시해야합니다. 이제이 목록은 동적이지만 데이터베이스에서 가져온 것이 아닙니다. 또한 시간이 지남에 따라 목록이 확장되기를 바랍니다.HTML Django ModelForm의 동적 목록과 함께 드롭 다운을 선택하십시오.

모델에서 :이 필드는 2005에서 3000까지만 값을 저장하고 그렇지 않으면 유효성 검증 오류를 던지는 IntegerField (?)와 같아야합니다.

내가 할 수있는 것 -보기에서 ChoiceField로 드롭 다운을 만들고 모델의 유효성 검사기를 설정합니다.

내가 원하는 것 -이 필드 이후 장고에서 ModelForm을 사용하고, 다른 모델과 함께 내 모델의 필드에 매핑합니다. 즉, 양식에서 필드를 정의하지는 않지만 모델에서만 필드를 정의 할 수 있습니다. 그러므로 문제는 나의 접근 방식은 무엇인가?

이 난 그렇게 멀리있는

class Member(models.Model): 
    d = int(datetime.datetime.now().strftime("%Y")) 
    ch = [(X,X) for X in range(2005,d)] 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    membership_type = models.IntegerField(validators=[validate_membership_type]) 
    batch = models.IntegerField(choices= ch) 

이 원하는 선택 필드 형태를 생성하지만, 값이 변경되지 않는 시도했다. "Years"를 'Minutes'로 대체하여 테스트했으며 범위는 모델을 시작할 때 서버 시작시의 상한으로 고정되어 있습니다. 즉, 모델이 생성 될 때입니다. 이 범위는보기에서 결정됩니다. 즉, 양식이 브라우저에로드 된 경우입니다.

답변

1

첫째,이 코드는 모델에 속하지 않고 양식에 속합니다.

두 번째로 동적 인 것이 필요한 경우에는 클래스 수준이 아닌 __init__ 메쏘드로 가야합니다. 따라서 :

class MemberForm(forms.ModelForm): 
    class Meta: 
     model = Member 
     fields = [..., 'batch', ...] 

    def __init__(self, *args, **kwargs): 
     super(MemberForm, self).__init__(*args, **kwargs) 
     d = datetime.datetime.now().year 
     ch = [(X,X) for X in range(2005, d)] 
     self.fields['batch'].choices = ch 
+0

빠른 답장을 보내 주신 Daniel에게 감사드립니다. 단 한가지, '이 코드는 모델에 속하지 않지만 형식에 속한다'는 것은 무엇을 의미합니까? 당신은 처음 두 줄을 언급하고 있으며 그런 논리가 모형의 일부가되어서는 안된다는 것을 암시하고 있습니까? (왜냐하면 나머지 '코드'를 사용하여 모델을 정의해야하기 때문에) 아니오 – kshubham07

+0

예, 동적 선택 항목을 의미합니다. 분명히 필드 정의는 모델의 일부이지만 거기에서 선택 사항을 완전히 제거해야합니다. –

+0

안녕 Daniel, 양식의 IntegerField에 choose 속성 (모델 클래스의 것)이 없기 때문에'self.fields [ 'batch']. choices = ch' 문이 작동하지 않습니다. 나는 그것을'self.fields [ 'batch']. widget = forms.Select (choices = ch)'로 바꾸었다. 귀하의 답변에이 변경을하십시오. 나는 정확한 것으로 표시 할 것입니다. 도움 주셔서 감사합니다. (y) – kshubham07