Python / Django - 表单选择值为对象ID... 无法获取对象

2 投票
4 回答
5702 浏览
提问于 2025-04-16 12:57

我有一个表单选择框,里面有一些值对应着不同的对象。用户选择一个选项后,表单就会提交。接着,我想用这个选项的值去找一个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=,请确保它返回的是一个数字。

撰写回答