2016-07-14 49 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