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

时间:2011-03-03 18:51:42

标签: python django django-forms

我有一个表单选择框,其中包含与对象相对应的值。用户选择输入并提交表单。然后我想获取该值并检索具有等于所选表单值的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 :(得分: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数据。

您可以在https://books.google.com.ar/books?id=8sU7DwAAQBAJ&pg=PA229&lpg=PA229&dq=form+cleaned_data+to+get+raw+post+data&source=bl&ots=RN9WKRaGJs&sig=QpSoPdI9YSHSNk0zAQIO8phSbOw&hl=es&sa=X&ved=0ahUKEwiBouHattnaAhULFZAKHUKmA4QQ6AEIRzAD#v=onepage&q=form%20cleaned_data%20to%20get%20raw%20post%20data&f=false

中阅读相关内容