【问题标题】:Python / Django - Form Selection Value is Object Id... Can't Get ObjectPython / Django - 表单选择值是对象 ID ...无法获取对象
【发布时间】:2011-03-03 18:51:42
【问题描述】:

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

【问题讨论】:

  • 你有没有找到一个干净的解决方案?我想我遇到了同样的问题,但只能找到我在下面发布的阴暗解决方案。

标签: python django django-forms


【解决方案1】:

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

不知何故,您的 form.cleaned_data['id'] 正在返回一个名为 Cars 的模型

如果你想将它传递给get(id=,请确保它返回一个数字

【讨论】:

  • 啊。将值打印到我的控制台后,我可以看到选择字段的文本作为值出现......因此,form.cleaned_data['id'] 将是以下示例中的名称: 。如何获得价值?
  • 我可以看看你的模板和表单代码吗? PS:值放在&lt;option&gt;标签上,而不是&lt;select&gt;
  • 哈哈。哎呀。模板:
  • 不,这太疯狂了! &lt;select&gt; 甚至不发布文本值。它只发布选定的value="2" 部分。你能用你的整个表单和视图更新你的帖子(而不是评论)吗?对我来说,最初的错误听起来像是别的东西
  • 我添加了它。我唯一能想到的是我创建了独立于 django 表单的选择框......但你是对的。除了选择的值之外,这不应该给我任何东西?.?.?。此外,此表格已从我为客户使用的整个表格中简化。
【解决方案2】:

您可以使用 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']

【讨论】:

    【解决方案3】:

    这可能很糟糕,但我认为可行的答案。如果有人有真正的解决方案,请发布,因为我仍然需要它。

    (我使用的是模型表单集,但只是模型表单可能工作相同)

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

    简而言之,改变

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

    car = form.cleaned_data['id']
    

    我认为它只是看起来像一个字符串,因为当您打印或调试时,它使用的是您的 str 或 unicode 表示。

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

    【讨论】:

      【解决方案4】:

      我有同样的问题...所以我尝试了以下方法:

      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 数据。目前,我无法弄清楚如何使用类似于“clean_data”的东西来验证和获取原始 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

      【讨论】:

        猜你喜欢
        • 2014-02-13
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        相关资源
        最近更新 更多