2011-04-08 2 views
1

나는이Django 및 ModelForm. 드롭 다운 상자에 IntegerField을 변경하는 방법

class RSVP (models.Model): 
    def __unicode__(self): 
      return self.firstName + " " + self.lastName 
    firstName = models.CharField(max_length=30) 
    lastName = models.CharField(max_length=30) 
    rsvpID = models.CharField(max_length=9, unique = True) 
    allowedAdults = models.IntegerField(default = 2) 
    allowedChildren = models.IntegerField(default = 0) 
    adultsAttending = models.IntegerField(default = 0) 
    childrenAttending = models.IntegerField(default = 0) 

과 같은 모델을 가지고 있고 나는 일이하고 싶은 어떤이

class RsvpForm(ModelForm): 
    class Meta: 
     model = RSVP 
     exclude= ('firstName', 'lastName', 'allowedAdults', 'allowedChildren') 

처럼 보이는 ModelForm을 가지고있다 대신의 성인용 텍스트 필드에 0에서 allowedAdults 값을 가진 드롭 다운 상자가 나타납니다. 이것은 결혼식 rsvp 사이트를위한 것이고 초대 대상자가 개별적으로 가져올 수있는 +1의 최대 수를 설정하고 싶습니다.

이 문제를 해결하는 방법에 대한 의견이 있으십니까?

class Invited(models.Model): 
    f_name = models.CharField() 
    l_name = models.CharField() 
    allowed_adults = models.IntegerField() 
    allowed_children = models.IntegerField() 

class RSVP(models.Model): 
    invited = models.ForeignKey(Invited) 
    adults_attending = models.IntegerField() 
    children_attending = models.IntegerField() 

그런 다음 당신은 초대 객체를 생성하고를 할당합니다

models.py :

답변

4

난 당신이 다른 모델에 허용 된 어린이/성인뿐만 아니라 이름을 포크 할 생각 해요 성인 및 어린이 허용. 그리고 RSVP 양식은 드롭 다운 상자에 대한 선택 사항을 생성 할 때 해당 번호를 고려합니다.

드롭 다운

ChoiceField

forms.py

class InvitedForm(forms.ModelForm): 
    class Meta: 
     model = Invited 

class RSVPForm(forms.ModelForm): 
    class Meta: 
     model = RSVP 
     exclude = ['invited',] 

    def __init__(self, *args, **kwargs): 
     max_adults = kwargs.pop('max_adults',2) #default to 2 if no max set 
     max_children = kwargs.pop('max_children',2) #default to 2 if no max set 

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

     adult_choices = ((x,str(x)) for x in range(max_adults+1))) 
     children_choices = ((x,str(x)) for x in range(max_children+1))) 

     self.fields['adults_attending'] = forms.ChoiceField(choices = adult_choices) 
     self.fields['children_attending'] = forms.ChoiceField(choices = children_choices) 

views.py

def rsvp_view(request, invited_id): 
    invited = get_object_or_404(Invited, pk=invited_id) 
    if request.method=='POST': 
     form = RSVPForm(request.POST, max_adults=invited.allowed_adults, 
         max_children=invited.allowed_children) 
     if form.is_valid(): 
      rsvp = form.save(commit=False) 
      rsvp.invited = invited 
      rsvp.save() 
      return HttpResponse("Success") 
    else: 
     form = RSVPForm(max_adults=invited.allowed_adults, max_children=invited.allowed_children) 

    context = { 'form':form, 
       'invited':invited } 
    return render_to_response('rsvp.html', context, 
           context_instance=RequestContext(request)) 
+0

감사 무리와 함께 IntegerField 위젯을 재정 의하여 구현 될 수있다! 그것은 완벽하게 작동했습니다. 모델을 분리 할 때 어떤 이점이 있습니까? 그냥 조직? – Andy

관련 문제