我有一个叫做Space
的模型,它有一个叫做guest
的字段,这个字段是一个选择字段,它只需要一个数字,比如说3
并将其保存在数据库中。我有另一个模型叫做Book
,其中的字段是no_of_persons
。把ForeignKey对象转到ChoicesField
现在,有可能是我通过Book
模型筛选'guest'
字段值是'3'
并将其显示为下拉(1,2,3),将不超过保存在guest
模型的数量。?
回想一下,guest
保存为一位数字。是否可以使其显示为从最低数字开始的下拉菜单?
我想要做的一个很好的例子就是Airbnb上'Guests'字段的值如何与'Booking'模型中的'Guests'字段相对应。
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错误。
感谢您的答复。这里的主要问题是将3改为像(1,2,3)这样的下拉菜单。我找到了解决这个问题的方法。 – YoYo
@YoYo我用示例示例更新了我的答案,希望它有帮助。 – Todor
我得到这个错误:强制转换为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