2011-03-03 83 views
2

我有一个表单选择框,其值与对象相对应。用户选择输入并提交表单。然后我想获取该值并检索具有与所选表单值等效的ID的对象。然而,当我尝试这样做,我得到一个错误,像这样:Python/Django - 表单选择值是对象ID ...无法获取对象

int()函数的参数必须是字符串或数字,而不是“汽车”

例子:

if form.is_valid(): 
    car = Car.objects.get(id=form.cleaned_data['id']) 

我猜测问题是返回的值是一个字符串,而不是一个整数。在PHP中,这是简单的。如何强制转换或使用返回的表单值来获取关联的对象?

好像Django的没有返回表单元素的值,而是对用户可见的选项名称...

Form类:

class CarForm(forms.ModelForm): 
    class Meta: 
     model = Car 

HTML表单:

<form action=""> 
    <select name="id"> 
     {% for car in cars %} 
      <option value="{{car.id}}">{{car.title}}</option> 
     {% endfor %} 
    </select> 
</form> 
+0

你有没有想过一个干净的解决方案呢?我认为我有同样的问题,但只能找到我下面发布的一个可疑解决方案。 – KobeJohn 2011-10-30 15:07:28

回答

1

id字段必须是整数或可以转换为整数的字符串。 就这么简单!

不知何故,你form.cleaned_data['id']返回一个叫做Cars

确保,如果你想将它传递到get(id=

+0

啊。将值打印到我的控制台后,我可以看到选择字段的文本正在作为值传递...因此,在以下示例中,form.cleaned_data ['id']将是NAME:。我如何获得价值? – GregL83 2011-03-03 19:03:11

+0

我可以请看看您的模板和表单代码吗? PS:价值被放在' {%endfor%} form:class CarForm (forms.ModelForm):TYPES = [['radio1','Choice1'],['radio2','Choice2']] link_type = forms.ChoiceField(choices = TYPES,required = False,widget = forms.RadioSelect(attrs = {'class':'related-resource-type'}))class Meta:model = Car表单元素在html中,并添加到表单标签内......也许这就是问题所在?这些表单元素必须在表单类中定义? – GregL83 2011-03-03 19:39:12

0

您可以使用,而不是生成使用HTML选择

ModelChoiceField它返回一个数字模型在forms.py中:

class CarSelectForm(forms.Form): 
    car = forms.ModelChoiceField(queryset=Car.objects.all(), empty_label=None) 

in view.py:

if form.is_valid(): 
    car = form.cleaned_data['car'] 
0

这可能是一个坏的,但我认为工作的答案。如果有人有一个真正的解决方案,请张贴,因为我仍然需要它。

(我使用modelformset,而只是一个可能的ModelForm工作相同)

对我来说,{{form.id}}工作在页面上(放ID)和回来正确POST数据。然而,它沿着这条线的某处被转换(如Yuji在他的帖子中所述)到由该id表示的模型对象中,这就是clean_data中的内容。

总之,改变

car = Car.objects.get(id=form.cleaned_data['id']) 

car = form.cleaned_data['id'] 

我认为它只是看起来像只是因为当您打印或调试,它使用您的海峡或Unicode表示的字符串。

重复:这几乎可以肯定是一种副作用或坏事情。如果我找出更好的方法,我会发布它。

+0

看到相同的问题。 – 2012-08-12 19:45:23