我有一个表单选择框,其中包含与对象相对应的值。用户选择输入并提交表单。然后我想获取该值并检索具有等于所选表单值的ID的对象。但是,当我尝试这样做时,我收到的错误是这样的:
int()参数必须是字符串或数字,而不是'Cars'
示例:
if form.is_valid():
car = Car.objects.get(id=form.cleaned_data['id'])
我猜测问题是返回的值是字符串而不是整数。在PHP中,这很简单。如何进行类型转换或使用返回的表单值来获取关联对象?
好像Django没有返回表单元素的值,而是返回用户可见的选项名称......
表格类:
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 :(得分:1)
id
字段必须是整数,或者可以转换为整数的字符串。
就这么简单!
不知何故,您的form.cleaned_data['id']
正在返回名为Cars
如果您想将其传递到get(id=
答案 1 :(得分:0)
您可以使用ModelChoiceField而不是使用HTML生成选择
form.py中的:
class CarSelectForm(forms.Form):
car = forms.ModelChoiceField(queryset=Car.objects.all(), empty_label=None)
在view.py中:
if form.is_valid():
car = form.cleaned_data['car']
答案 2 :(得分:0)
这可能是一个坏事,但我认为是有效的答案。如果有人有真正的解决方案,请发帖,因为我仍然需要它。
(我正在使用modelformset,但只是一个模型可能会起作用)
对我来说,{{form.id}}适用于页面(放置id)并在POST数据中正确返回。然而,在它的某个地方它被转换(如Yuji在他的帖子中所说)到由id表示的模型对象中,这就是clean_data中的内容。
简而言之,改变
car = Car.objects.get(id=form.cleaned_data['id'])
到
car = form.cleaned_data['id']
我认为它只是看起来像一个字符串,因为当你打印或调试时,它正在使用你的str或unicode表示。
重复:这几乎可以肯定是做事的副作用或坏方法。如果我找到更好的方法,我会发布它。
答案 3 :(得分:-1)
我有同样的问题......所以我尝试了以下内容:
ts_1 = form.cleaned_data['lista_trabajos']
ts_2 = request.POST['lista_trabajos']
print(ts_1) # this returns what user sees, ex: 1 - folders
print(ts_2) # this returns value from that option, in my case: 1
不幸的是,我一直在阅读,建议不要使用原始POST数据。目前,我无法弄清楚如何通过使用与&#34; clean_data&#34;类似的东西来验证和获取原始POST数据。
中阅读相关内容