Django和ModelForm。如何将IntegerField更改为下拉框

时间:2011-04-08 22:29:19

标签: django django-forms

我有一个看起来像这样的模型

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)

我有一个看起来像这样的ModelForm

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

我想要发生的是,而不是成人参与的文本字段,显示值为0到allowAdults的下拉框。这是一个婚礼rsvp网站,我想设置被邀请者可以带来个人基础的+ 1的最大数量

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:5)

我想你想把允许的孩子/成人以及名字分到另一个模特身上:

models.py

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()

然后,您将创建受邀对象并分配允许的成人和孩子。在为您的下拉框生成选项时,RSVP表单会考虑这些数字。

可以通过使用ChoiceField

覆盖IntegerField小部件来实现下拉菜单

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))