2016-07-14 85 views
0

我有一个叫做Space的模型,它有一个叫做guest的字段,这个字段是一个选择字段,它只需要一个数字,比如说3并将其保存在数据库中。我有另一个模型叫做Book,其中的字段是no_of_persons把ForeignKey对象转到ChoicesField

现在,有可能是我通过Book模型筛选'guest'字段值是'3'并将其显示为下拉(1,2,3),将不超过保存在guest模型的数量。?

回想一下,guest保存为一位数字。是否可以使其显示为从最低数字开始的下拉菜单?

我想要做的一个很好的例子就是Airbnb上'Guests'字段的值如何与'Booking'模型中的'Guests'字段相对应。

enter image description here

UPDATE:

由托多尔尝试的建议后,提示以下错误。

coercing to Unicode: need string or buffer, int found 

模型

class Space(models.Model): 
    user= models.ForeignKey(User) 
    no_of_guest=models.CharField(max_length=30, choices=MAX_SPACE_CHOICES, verbose_name='no_of_guest') 
    #other fields 

    def __unicode__(self): 
     return '%s, %s, %s, %s, %s' % (self.user, self.id, self.name, self.address, self.no_of_guest) 

class BookSpace(models.Model): 
    user= models.ForeignKey(User) 
    space= models.ForeignKey(Space) 
    check_in_date= models.DateField() 
    check_out_date= models.DateField() 
    no_of_persons= models.CharField(max_length=10) 
    #other fields 

    def __unicode__(self): 
     return '%s, %s, %s' % (self.user, self.space, self.full_name) 

class BookSpaceForm(forms.ModelForm): 
    class Meta: 
     model= BookSpace 
     exclude=('#fields not needed') 

    def __init__(self, *args, **kwargs): 
     space= kwargs.pop('space') 
     super(BookSpaceForm, self).__init__(*args, **kwargs) 
     guest_choices= [(i, str(i)) for i in range(1, int(space.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget= forms.ChoiceField(choices=guest_choices) 

更新之后,我越来越

KeyError异常 u'space” 异常地点:models.py在初始化,线202

该行是:

space= kwargs.pop('space') 

在我的看法:

def book_a_space(request, space_id): 
    space= Space.objects.get(pk=space_id) 
    if request.method=="POST": 
     form=BookSpaceForm(request.POST) 
     if form.is_valid(): 
      #other data and more 
     else: 
      print form.errors 

    else: 
     form=BookSpaceForm(space=space) 
     return render(request, 'spaceb/book_space_form.html', {'BookSpaceForm':BookSpaceForm}) 

模板:

{{ BookSpaceForm.as_p }} 

UPDATE:

仍然得到KeyError异常。我修改这样的模式:

def __init__(self, *args, **kwargs): 
    space_id= kwargs.pop('space_id') 
    super(BookSpaceForm, self).__init__(*args, **kwargs) 
    if space_id: 
     guest_choices = [(str(i), str(i)) for i in range(1, int(space_id.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget = forms.ChoiceField(choices=guest_choices) 

而在我的意见,我也

def book_a_space(request, space_id): 
     space= Space.objects.get(pk=space_id) 
     if request.method=="POST": 
      form=BookSpaceForm(request.POST) 
      if form.is_valid(): 
       #other data and more 
      else: 
       print form.errors 

     else: 
      context = { 
       'BookSpaceForm': BookSpaceForm(space_id=space_id), 
       'space_id': Space.objects.get(id=space_id) 
      } 
      return render(request, 'spaceb/book_space_form.html', context) 

而且我得到这个错误:

'unicode' object has no attribute 'no_of_guest' 

我改变了的Unicode在BookSpace型号返回:

return '%s, %s, %s' % (self.user, self.space_id.no_of_guest, self.full_name) 

然而..仍然得到相同的unicode错误。

回答

1

您可以创建自定义的Book表单,该表单在构建时接受guest实例,并使用选择框动态更改no_of_persons字段的窗口小部件。

的范例:

class BookForm(forms.ModelForm): 
    class Meta: 
     model = Book 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     space = kwargs.pop('space') 
     super(BookForm, self).__init__(*args, **kwargs) 
     guest_choices = [(str(i), str(i)) for i in range(1, int(space.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget = forms.Select(choices=guest_choices) 


#sample usage 
def book_a_space(request, space_id): 
    space = Space.objects.get(pk=space_id) 
    if request.method == "POST": 
     form = BookSpaceForm(request.POST, space=space) 
     if form.is_valid(): 
      #other data and more 
     else: 
      print form.errors 
    else: 
     form = BookSpaceForm(space=space) 

    return render(request, 'spaceb/book_space_form.html', { 
     'form': form, 
     'space': space, 
    }) 
+0

感谢您的答复。这里的主要问题是将3改为像(1,2,3)这样的下拉菜单。我找到了解决这个问题的方法。 – YoYo

+0

@YoYo我用示例示例更新了我的答案,希望它有帮助。 – Todor

+0

我得到这个错误:强制转换为Unicode:需要字符串或缓冲区,int在此行上找到guest_choices = [(i,str(i))for i in range(1,space.guest + 1)]我试过guest_choices = [(i,int(str(i)))我在范围内(1,sharedcrib.no_of_guest + 1)]但仍然是相同的错误 – YoYo