Python / Django - 表单选择值为对象ID... 无法获取对象
我有一个表单选择框,里面有一些值对应着不同的对象。用户选择一个选项后,表单就会提交。接着,我想用这个选项的值去找一个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>
4 个回答
0
这可能不是最好的答案,但我觉得可以用。如果有人有真正的解决办法,请分享一下,因为我还是需要这个。
(我在使用一个模型表单集,但单独的模型表单可能也能一样工作)
对我来说,{{ form.id }} 在页面上是有效的(能显示出 id),并且在 POST 数据中也能正确返回。不过,在某个环节,它被转换成了一个模型对象(正如 Yuji 在他的帖子中提到的),这就是在 cleaned_data 中看到的内容。
简单来说,把
car = Car.objects.get(id=form.cleaned_data['id'])
改成
car = form.cleaned_data['id']
我觉得它看起来像字符串,是因为当你打印或者调试的时候,它使用的是你的字符串或 Unicode 表示。
再说一次:这几乎肯定是一个副作用或者不太好的做法。如果我找到更好的方法,我会分享的。
0
你可以用ModelChoiceField来代替直接用HTML生成下拉选择框。
在forms.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']
1
这个id
字段必须是一个整数,或者是可以转换成整数的字符串。就这么简单!
但你的form.cleaned_data['id']
却返回了一个叫Cars
的模型。
如果你想把它传入get(id=
,请确保它返回的是一个数字。